00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013 #ifndef __MMX__VECTOR_SIMD__HPP
00014 #define __MMX__VECTOR_SIMD__HPP
00015 #include <numerix/simd.hpp>
00016 #include <algebramix/vector_unrolled.hpp>
00017 #include <algebramix/vector_aligned.hpp>
00018 #include <algebramix/vector_sse.hpp>
00019
00020 namespace mmx {
00021
00022
00023
00024
00025
00026 template<nat len1, nat len2, typename V= vector_naive>
00027 struct vector_simd: public vector_aligned<
00028 vector_unrolled<len1,V>,
00029 vector_unrolled<len2,V> >
00030 {
00031 typedef vector_simd<len1,len2,typename V::Naive> Naive;
00032 typedef vector_simd<len1,len2,typename V::Aligned> Aligned;
00033 typedef vector_unrolled<len1,typename V::No_simd> No_simd;
00034 typedef vector_simd<len1,len2,typename V::No_thread> No_thread;
00035 };
00036
00037 template<typename F, typename V, nat len1, nat len2, typename W>
00038 struct implementation<F,V,vector_simd<len1,len2,W> >:
00039 public implementation<F,V,vector_aligned<
00040 vector_unrolled<len1,W>,
00041 vector_unrolled<len2,W> > > {};
00042
00043
00044
00045
00046
00047 #define Vector_simd_variant(C) vector_simd_variant_helper<C>::VV
00048
00049 template<typename C>
00050 struct vector_simd_variant_helper {
00051 typedef vector_simd<4,4> VV; };
00052
00053 STMPL
00054 struct vector_simd_variant_helper<double> {
00055 typedef vector_simd<8,4> VV; };
00056
00057 STMPL
00058 struct vector_simd_variant_helper<char> {
00059 typedef vector_simd<32,4> VV; };
00060
00061 STMPL
00062 struct vector_simd_variant_helper<signed char> {
00063 typedef vector_simd<32,4> VV; };
00064
00065 STMPL
00066 struct vector_simd_variant_helper<unsigned char> {
00067 typedef vector_simd<32,4> VV; };
00068
00069 STMPL
00070 struct vector_simd_variant_helper<short int> {
00071 typedef vector_simd<32,4 > VV; };
00072
00073 STMPL
00074 struct vector_simd_variant_helper<short unsigned int> {
00075 typedef vector_simd<32, 4> VV; };
00076
00077 STMPL
00078 struct vector_simd_variant_helper<int> {
00079 typedef vector_simd<16, 4> VV; };
00080
00081 STMPL
00082 struct vector_simd_variant_helper<unsigned int> {
00083 typedef vector_simd<16, 4> VV; };
00084
00085 STMPL
00086 struct vector_simd_variant_helper<long int> {
00087 typedef vector_simd<16, 4> VV; };
00088
00089 STMPL
00090 struct vector_simd_variant_helper<long unsigned int> {
00091 typedef vector_simd<16, 4> VV; };
00092
00093 STMPL
00094 struct vector_simd_variant_helper<long long int> {
00095 typedef vector_simd<8,4> VV; };
00096
00097 STMPL
00098 struct vector_simd_variant_helper<long long unsigned int> {
00099 typedef vector_simd<8,4> VV;
00100 };
00101
00102 }
00103
00104 #endif // __MMX__VECTOR_SIMD__HPP