@@ -431,27 +431,50 @@ template <typename K> class Vector {
431431 * @param v Second 3D vector.
432432 * @return Resulting 3D vector.
433433 */
434+
434435 __attribute__ ((always_inline, hot, flatten)) static inline Vector<float >
435436 cross_product (const Vector<float > &u, const Vector<float > &v) {
436437 if (u.size () != 3 || v.size () != 3 )
437438 throw std::invalid_argument (" Cross product is only defined for 3D vectors." );
438439
439440 Vector<float > r (3 );
440441
442+ #if defined(TENSORIUM_X86)
441443 __m128 uxy = _mm_set_ps (0 .0f , u.data [0 ], u.data [2 ], u.data [1 ]);
442444 __m128 vxy = _mm_set_ps (0 .0f , v.data [0 ], v.data [2 ], v.data [1 ]);
443-
445+ #elif defined(TENSORIUM_ARM)
446+ float32x4_t uxy = {0 .0f , u.data [0 ], u.data [2 ], u.data [1 ]};
447+ float32x4_t vxy = {0 .0f , v.data [0 ], v.data [2 ], v.data [1 ]};
448+ #else
449+ (void )0 ;
450+ #endif
451+
452+ // Produit vectoriel (portable et optimisé)
453+ #if defined(__FMA__) || defined(TENSORIUM_X86) || defined(TENSORIUM_ARM)
444454 r.data [0 ] = std::fma (u.data [1 ], v.data [2 ], -u.data [2 ] * v.data [1 ]);
445455 r.data [1 ] = std::fma (u.data [2 ], v.data [0 ], -u.data [0 ] * v.data [2 ]);
446456 r.data [2 ] = std::fma (u.data [0 ], v.data [1 ], -u.data [1 ] * v.data [0 ]);
457+ #else
458+ r.data [0 ] = u.data [1 ] * v.data [2 ] - u.data [2 ] * v.data [1 ];
459+ r.data [1 ] = u.data [2 ] * v.data [0 ] - u.data [0 ] * v.data [2 ];
460+ r.data [2 ] = u.data [0 ] * v.data [1 ] - u.data [1 ] * v.data [0 ];
461+ #endif
447462
448463 return r;
449464 }
450465
451- Vector<K>& operator +=(const Vector<K>& m) { this ->add (m); return *this ; }
452- Vector<K>& operator -=(const Vector<K>& m) { this ->sub (m); return *this ; }
453- Vector<K>& operator *=(K alpha) { this ->scl (alpha); return *this ; }
454-
466+ Vector<K> &operator +=(const Vector<K> &m) {
467+ this ->add (m);
468+ return *this ;
469+ }
470+ Vector<K> &operator -=(const Vector<K> &m) {
471+ this ->sub (m);
472+ return *this ;
473+ }
474+ Vector<K> &operator *=(K alpha) {
475+ this ->scl (alpha);
476+ return *this ;
477+ }
455478};
456479
457480template <typename K> inline Vector<K> operator +(const Vector<K> &a, const Vector<K> &b) {
0 commit comments