1 /* Copyright (C) 2013-2014 Povilas Kanapickas <povilas@radix.lt> 2 3 Distributed under the Boost Software License, Version 1.0. 4 (See accompanying file LICENSE_1_0.txt or copy at 5 http://www.boost.org/LICENSE_1_0.txt) 6 */ 7 8 #ifndef LIBSIMDPP_SIMDPP_DETAIL_EXPR_I_MUL_H 9 #define LIBSIMDPP_SIMDPP_DETAIL_EXPR_I_MUL_H 10 11 #ifndef LIBSIMDPP_SIMD_H 12 #error "This file must be included through simd.h" 13 #endif 14 15 #include <simdpp/types.h> 16 #include <simdpp/detail/get_expr.h> 17 #include <simdpp/detail/insn/i_mul_lo.h> 18 #include <simdpp/detail/insn/i_mul_hi.h> 19 20 namespace simdpp { 21 namespace SIMDPP_ARCH_NAMESPACE { 22 namespace detail { 23 24 template<class R, class E1, class E2> 25 struct expr_eval<R, expr_mul_lo<E1, E2>> { 26 static SIMDPP_INL R eval(const expr_mul_lo<E1, E2>& e) 27 { 28 using E = get_expr_uint_impl<E1, E2>; 29 return (R) insn::i_mul_lo( 30 eval_maybe_scalar<typename E::v1_final_type, E1>::eval(e.a), 31 eval_maybe_scalar<typename E::v2_final_type, E2>::eval(e.b)); 32 } 33 }; 34 35 template<class R, class E1, class E2> 36 struct expr_eval<R, expr_mul_hi<E1, E2>> { 37 static SIMDPP_INL R eval(const expr_mul_hi<E1, E2>& e) 38 { 39 using E = get_expr2_same<E1, E2>; 40 return (R) insn::i_mul_hi( 41 eval_maybe_scalar<typename E::v1_final_type, E1>::eval(e.a), 42 eval_maybe_scalar<typename E::v2_final_type, E2>::eval(e.b)); 43 } 44 }; 45 46 } // namespace detail 47 } // namespace SIMDPP_ARCH_NAMESPACE 48 } // namespace simdpp 49 50 #endif 51 52