My Project
quadInt.h
Go to the documentation of this file.
1 /* quadInt.h
2  */
3 #ifndef EVAL_CONTAINER_QUAD_INT_H
4 #define EVAL_CONTAINER_QUAD_INT_H
5 
6 #include "osl/config.h"
7 #include "osl/container.h"
8 #include "osl/bits/align16New.h"
9 
10 #if (defined __INTEL_COMPILER || defined __clang__)
11 # include <emmintrin.h>
12 # ifdef __INTEL_COMPILER
13 # define __builtin_ia32_pxor128 _mm_xor_pd
14 # endif
15 # define __builtin_ia32_psubd128 _mm_sub_epi32
16 # define __builtin_ia32_paddd128 _mm_add_epi32
17 #endif
18 
19 #ifndef OSL_NO_SSE
20 #if (defined __x86_64__) || (defined __i386__)
21 # ifndef OSL_USE_SSE
22 # define OSL_USE_SSE 1
23 # endif
24 #else
25 # warning "QuadInt without SSE"
26 #endif
27 #endif
28 
29 namespace osl
30 {
31  namespace container
32  {
33 #ifdef OSL_USE_SSE
34 # ifdef __INTEL_COMPILER
35  typedef __v4si v4si;
36  typedef __v2di v2di;
37 # else
38  typedef int v4si __attribute__ ((vector_size (16)));
39  typedef long long v2di __attribute__ ((vector_size (16)));
40 # endif
41 #endif
42  struct QuadInt : public misc::Align16New
43  {
44  union XMM{
47 #ifdef OSL_USE_SSE
48  v4si v4;
49  v2di v2;
50 #endif
51  } v
52 #ifdef OSL_USE_SSE
53  __attribute__((aligned(16)))
54 #endif
55  ;
57  clear();
58  }
59  QuadInt(QuadInt const& si){
60 #if OSL_USE_SSE
61  v.v4=si.v.v4;
62 #else
63  v.llv = si.v.llv;
64 #endif
65  }
66  QuadInt& operator=(QuadInt const& si)
67  {
68 #if OSL_USE_SSE
69  v.v4=si.v.v4;
70 #else
71  v.llv = si.v.llv;
72 #endif
73  return *this;
74  }
75  void clear()
76  {
77 #if OSL_USE_SSE
78  v.v4=(v4si){ 0, 0, 0, 0 };
79 #else
80  v.llv[0] = v.llv[1] = 0;
81 #endif
82  }
83  int& operator[](int i) {
84  return v.iv[i];
85  }
86  const int& operator[](int i) const {
87  return v.iv[i];
88  }
89  QuadInt operator-() const{
90  QuadInt ret;
91  ret -= *this;
92  return ret;
93  }
94  QuadInt& operator+=(QuadInt const& si){
95 #if OSL_USE_SSE
96  v.v4=__builtin_ia32_paddd128(v.v4,si.v.v4);
97 #else
98  for(int i=0;i<4;i++) v.iv[i]+=si.v.iv[i];
99 #endif
100  return *this;
101  }
103 #if OSL_USE_SSE
104  v.v4=__builtin_ia32_psubd128(v.v4,si.v.v4);
105 #else
106  for(int i=0;i<4;i++) v.iv[i]-=si.v.iv[i];
107 #endif
108  return *this;
109  }
110  QuadInt& operator*=(int scale){
111 #if OSL_USE_SSE41
112  XMM val;
113  unsigned long long scalescale=(unsigned long long )((unsigned int)scale);
114  scalescale|=scalescale<<32ull;
115  val.v2=__builtin_ia32_vec_set_v2di(val.v2,(long long)scalescale,0);
116  val.v2=__builtin_ia32_vec_set_v2di(val.v2,(long long)scalescale,1);
117  v.v4=__builtin_ia32_pmulld128(v.v4,val.v4);
118 #else
119  for(int i=0;i<4;i++) v.iv[i]*=scale;
120 #endif
121  return *this;
122  }
123  static size_t size() { return 4; }
124  };
125  inline QuadInt operator+(QuadInt const& si0,QuadInt const& si1)
126  {
127  QuadInt ret(si0);
128  ret+=si1;
129  return ret;
130  }
131  inline QuadInt operator-(QuadInt const& si0,QuadInt const& si1)
132  {
133  QuadInt ret(si0);
134  ret-=si1;
135  return ret;
136  }
137  inline QuadInt operator*(QuadInt const& si0,int scale)
138  {
139  QuadInt ret(si0);
140  ret*=scale;
141  return ret;
142  }
143  inline bool operator==(QuadInt const& l,QuadInt const& r)
144  {
145  return l.v.llv[0] == r.v.llv[0] && l.v.llv[1] == r.v.llv[1];
146  }
147  inline bool operator<(QuadInt const& l,QuadInt const& r)
148  {
149  if (l.v.llv[0] != r.v.llv[0])
150  return (l.v.llv[0] < r.v.llv[0]);
151  return l.v.llv[1] < r.v.llv[1];
152  }
153 
155  {
157  public:
159  const QuadInt& operator[](int i) const{
160  return v[i];
161  }
162  const QuadInt& operator[](Player pl) const{
163  return v[pl];
164  }
166  return v[i];
167  }
169  return v[pl];
170  }
172  v[0]+=a.v[0];
173  v[1]+=a.v[1];
174  return *this;
175  }
177  v[0]-=a.v[0];
178  v[1]-=a.v[1];
179  return *this;
180  }
181  };
182  inline QuadIntPair operator+(QuadIntPair const& si0,QuadIntPair const& si1)
183  {
184  QuadIntPair ret(si0);
185  ret+=si1;
186  return ret;
187  }
188  inline QuadIntPair operator-(QuadIntPair const& si0,QuadIntPair const& si1)
189  {
190  QuadIntPair ret(si0);
191  ret-=si1;
192  return ret;
193  }
194  inline bool operator==(QuadIntPair const& l,QuadIntPair const& r)
195  {
196  return l[0] == r[0] && l[1] == r[1];
197  }
198  }
199 
200  using container::QuadInt;
201  using container::QuadIntPair;
202 }
203 #endif // EVAL_CONTAINER_QUAD_INT_H
204 // ;;; Local Variables:
205 // ;;; mode:c++
206 // ;;; c-basic-offset:2
207 // ;;; End:
osl::container::QuadInt::XMM
Definition: quadInt.h:44
osl::container::QuadIntPair::operator[]
QuadInt & operator[](int i)
Definition: quadInt.h:165
osl::container::QuadInt
Definition: quadInt.h:43
osl::container::QuadInt::clear
void clear()
Definition: quadInt.h:75
osl::container::QuadIntPair
Definition: quadInt.h:155
osl::container::QuadInt::operator[]
const int & operator[](int i) const
Definition: quadInt.h:86
osl::container::QuadInt::XMM::llv
CArray< long long, 2 > llv
Definition: quadInt.h:46
osl::container::QuadIntPair::operator+=
QuadIntPair & operator+=(QuadIntPair const &a)
Definition: quadInt.h:171
osl::container::QuadInt::operator-=
QuadInt & operator-=(QuadInt const &si)
Definition: quadInt.h:102
osl::container::operator-
QuadInt operator-(QuadInt const &si0, QuadInt const &si1)
Definition: quadInt.h:131
osl::container::QuadInt::QuadInt
QuadInt()
Definition: quadInt.h:56
osl::container::QuadInt::size
static size_t size()
Definition: quadInt.h:123
osl::container::QuadIntPair::operator-=
QuadIntPair & operator-=(QuadIntPair const &a)
Definition: quadInt.h:176
osl::container::operator+
QuadInt operator+(QuadInt const &si0, QuadInt const &si1)
Definition: quadInt.h:125
osl::container::operator==
bool operator==(BitXmask l, BitXmask r)
Definition: bitXmask.h:33
osl::misc::Align16New
Definition: align16New.h:12
osl::container::QuadInt::operator*=
QuadInt & operator*=(int scale)
Definition: quadInt.h:110
osl::container::QuadInt::operator[]
int & operator[](int i)
Definition: quadInt.h:83
osl::container::QuadIntPair::v
CArray< QuadInt, 2 > v
Definition: quadInt.h:156
osl::container::QuadInt::XMM::iv
CArray< int, 4 > iv
Definition: quadInt.h:45
container.h
osl::container::QuadIntPair::QuadIntPair
QuadIntPair()
Definition: quadInt.h:158
osl::container::QuadIntPair::operator[]
const QuadInt & operator[](Player pl) const
Definition: quadInt.h:162
osl::container::QuadInt::v
union osl::container::QuadInt::XMM v
align16New.h
osl::container::QuadInt::QuadInt
QuadInt(QuadInt const &si)
Definition: quadInt.h:59
osl::container::operator*
QuadInt operator*(QuadInt const &si0, int scale)
Definition: quadInt.h:137
osl::container::operator<
bool operator<(BitXmask l, BitXmask r)
Definition: bitXmask.h:41
osl::container::QuadInt::operator+=
QuadInt & operator+=(QuadInt const &si)
Definition: quadInt.h:94
config.h
osl::Player
Player
Definition: basic_type.h:8
osl::container::QuadIntPair::operator[]
const QuadInt & operator[](int i) const
Definition: quadInt.h:159
osl::CArray< int, 4 >
osl::container::QuadIntPair::operator[]
QuadInt & operator[](Player pl)
Definition: quadInt.h:168
osl::__attribute__
const PtypeO PTYPEO_EDGE __attribute__((unused))
osl
Definition: additionalEffect.h:6
osl::container::QuadInt::operator-
QuadInt operator-() const
Definition: quadInt.h:89
osl::container::QuadInt::operator=
QuadInt & operator=(QuadInt const &si)
Definition: quadInt.h:66