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"
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
29namespace 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 }
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 }
90 QuadInt ret;
91 ret -= *this;
92 return ret;
93 }
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:
QuadIntPair & operator-=(QuadIntPair const &a)
Definition quadInt.h:176
QuadInt & operator[](Player pl)
Definition quadInt.h:168
const QuadInt & operator[](Player pl) const
Definition quadInt.h:162
QuadInt & operator[](int i)
Definition quadInt.h:165
const QuadInt & operator[](int i) const
Definition quadInt.h:159
CArray< QuadInt, 2 > v
Definition quadInt.h:156
QuadIntPair & operator+=(QuadIntPair const &a)
Definition quadInt.h:171
QuadInt operator*(QuadInt const &si0, int scale)
Definition quadInt.h:137
bool operator==(BitXmask l, BitXmask r)
Definition bitXmask.h:33
QuadInt operator+(QuadInt const &si0, QuadInt const &si1)
Definition quadInt.h:125
QuadInt operator-(QuadInt const &si0, QuadInt const &si1)
Definition quadInt.h:131
bool operator<(BitXmask l, BitXmask r)
Definition bitXmask.h:41
Player
Definition basic_type.h:8
const PtypeO PTYPEO_EDGE __attribute__((unused))
union osl::container::QuadInt::XMM v
const int & operator[](int i) const
Definition quadInt.h:86
QuadInt & operator-=(QuadInt const &si)
Definition quadInt.h:102
int & operator[](int i)
Definition quadInt.h:83
QuadInt(QuadInt const &si)
Definition quadInt.h:59
QuadInt & operator*=(int scale)
Definition quadInt.h:110
static size_t size()
Definition quadInt.h:123
QuadInt & operator=(QuadInt const &si)
Definition quadInt.h:66
QuadInt operator-() const
Definition quadInt.h:89
QuadInt & operator+=(QuadInt const &si)
Definition quadInt.h:94
CArray< int, 4 > iv
Definition quadInt.h:45
CArray< long long, 2 > llv
Definition quadInt.h:46