1// { dg-do compile { target i?86-*-* x86_64-*-* } } 2// { dg-options "-std=c++11 -O3 -march=westmere" } 3 4template <int> struct int_ {}; 5template <typename> struct add_const { typedef int type; }; 6template <typename> struct add_reference { typedef int type; }; 7template <typename T> struct next { typedef typename T::next type; }; 8template <typename> struct size_impl; 9template <typename T> struct msvc_eti_base : T {}; 10template <int N> struct long_ { 11 static const int value = N; 12 typedef long_<N + 1> next; 13}; 14template <typename Sequence> 15struct size : msvc_eti_base<typename size_impl< 16typename Sequence::tag>::template apply<Sequence>> {}; 17template <typename Base> struct v_item : Base { 18 typedef typename next<typename Base::size>::type size; 19}; 20template <typename = int> struct vector0 { 21 typedef int tag; 22 typedef long_<0> size; 23}; 24template <> struct size_impl<int> { 25 template <typename Vector> struct apply : Vector::size {}; 26}; 27template <typename> struct vector3 : v_item<v_item<v_item<vector0<>>>> {}; 28template <typename> struct layout { typedef vector3<int> color_space_t; }; 29template <typename> struct kth_element_const_reference_type; 30template <typename> struct iterator_adaptor_get_base; 31template <typename, typename, int> struct homogeneous_color_base; 32template <typename> struct element_const_reference_type; 33template <typename Element, typename Layout> 34 struct homogeneous_color_base<Element, Layout, 3> { 35 Element _v0, _v1, _v2; 36 typename element_const_reference_type<homogeneous_color_base>::type 37 at(int_<0>) { 38 return _v0; 39 } 40 typename element_const_reference_type<homogeneous_color_base>::type 41 at(int_<1>) { 42 return _v1; 43 } 44 typename element_const_reference_type<homogeneous_color_base>::type 45 at(int_<2>) { 46 return _v2; 47 } 48}; 49template <typename Element, typename Layout, int K1> 50 struct kth_element_const_reference_type< 51 homogeneous_color_base<Element, Layout, K1>> 52 : add_reference<typename add_const<Element>::type> {}; 53template <int K, typename E, typename L, int N> 54 typename add_reference<typename add_const<E>::type>::type 55 at_c(homogeneous_color_base<E, L, N> p1) { 56 return p1.at(int_<K>()); 57} 58template <typename> class memory_based_step_iterator; 59template <typename> class memory_based_2d_locator; 60template <typename> class image_view; 61template <typename, typename> struct pixel; 62struct iterator_type_from_pixel { 63 typedef pixel<unsigned char, layout<vector3<int>>> *type; 64}; 65template <typename XIterator> struct type_from_x_iterator { 66 typedef image_view< 67 memory_based_2d_locator<memory_based_step_iterator<XIterator>>> view_t; 68}; 69template <typename> 70struct element_const_reference_type 71: kth_element_const_reference_type< 72homogeneous_color_base<unsigned, layout<int>, 3>> {}; 73template <typename, typename> 74 struct pixel : homogeneous_color_base<unsigned char, layout<int>, 75 size<layout<int>::color_space_t>::value> { 76}; 77template <typename Iterator> 78struct iterator_adaptor_get_base<memory_based_step_iterator<Iterator>> { 79 typedef Iterator type; 80}; 81template <typename> class memory_based_2d_locator { 82 public: 83 typedef iterator_adaptor_get_base<memory_based_step_iterator< 84 pixel<unsigned, layout<vector3<int>>> *>>::type x_iterator; 85}; 86template <typename> class image_view { 87 public: 88 typedef memory_based_2d_locator<int>::x_iterator x_iterator; 89 x_iterator row_begin___trans_tmp_2; 90 x_iterator row_begin(int) { return row_begin___trans_tmp_2; } 91}; 92template <typename, bool, typename = int> class image { 93 public: 94 typedef type_from_x_iterator<iterator_type_from_pixel::type>::view_t view_t; 95 image(int); 96}; 97template <typename Pixel, bool IsPlanar, typename Alloc> 98 typename image<Pixel, 0>::view_t view(image<Pixel, IsPlanar, Alloc>); 99template <typename Op> void measure_time(Op p1) { 100 for (;;) 101 p1(); 102} 103template <typename, typename> struct fill_nongil_t; 104template <typename T, typename P> 105 struct fill_nongil_t< 106 image_view<memory_based_2d_locator< 107 memory_based_step_iterator<pixel<T, layout<vector3<int>>> *>>>, 108 P> { 109 typedef image_view<memory_based_2d_locator< 110 memory_based_step_iterator<pixel<T, layout<vector3<int>>> *>>> View; 111 View _v; 112 P _p; 113 fill_nongil_t(View p1, P) : _v(p1) {} 114 void operator()() { 115 T *first = (T *)_v.row_begin(0); 116 T last; 117 while (first != &last) { 118 first[0] = at_c<0>(_p); 119 first[1] = at_c<1>(_p); 120 first[2] = at_c<2>(_p); 121 first += 3; 122 } 123 } 124}; 125template <typename, typename> void test_fill(int) { 126 image<int, 0>::view_t __trans_tmp_1; 127 image<int, 0> im(0); 128 __trans_tmp_1 = view(im); 129 measure_time(fill_nongil_t< 130 image_view<memory_based_2d_locator<memory_based_step_iterator< 131 pixel<unsigned char, layout<vector3<int>>> *>>>, 132 pixel<unsigned, int>>(__trans_tmp_1, pixel<unsigned, int>())); 133} 134void performance_testtest_method() { 135 test_fill<image_view<int>, pixel<unsigned, int>>(0); 136} 137