quadInt.h
Go to the documentation of this file.
/* quadInt.h
*/
#ifndef EVAL_CONTAINER_QUAD_INT_H
#define EVAL_CONTAINER_QUAD_INT_H
#include "osl/config.h"
#include "osl/container.h"
#include "osl/bits/align16New.h"
#if (defined __INTEL_COMPILER || defined __clang__)
# include <emmintrin.h>
# ifdef __INTEL_COMPILER
# define __builtin_ia32_pxor128 _mm_xor_pd
# endif
# define __builtin_ia32_psubd128 _mm_sub_epi32
# define __builtin_ia32_paddd128 _mm_add_epi32
#endif
#ifndef OSL_NO_SSE
#if (defined __x86_64__) || (defined __i386__)
# ifndef OSL_USE_SSE
# define OSL_USE_SSE 1
# endif
#else
# warning "QuadInt without SSE"
#endif
#endif
namespace osl
{
namespace container
{
#ifdef OSL_USE_SSE
# ifdef __INTEL_COMPILER
typedef __v4si v4si;
typedef __v2di v2di;
# else
typedef int v4si __attribute__ ((vector_size (16)));
typedef long long v2di __attribute__ ((vector_size (16)));
# endif
#endif
struct QuadInt : public misc::Align16New
{
union XMM{
CArray<int,4> iv;
CArray<long long,2> llv;
#ifdef OSL_USE_SSE
v4si v4;
v2di v2;
#endif
} v
#ifdef OSL_USE_SSE
__attribute__((aligned(16)))
#endif
;
QuadInt(){
clear();
}
QuadInt(QuadInt const& si){
#if OSL_USE_SSE
v.v4=si.v.v4;
#else
v.llv = si.v.llv;
#endif
}
QuadInt& operator=(QuadInt const& si)
{
#if OSL_USE_SSE
v.v4=si.v.v4;
#else
v.llv = si.v.llv;
#endif
return *this;
}
void clear()
{
#if OSL_USE_SSE
v.v4=(v4si){ 0, 0, 0, 0 };
#else
v.llv[0] = v.llv[1] = 0;
#endif
}
int& operator[](int i) {
return v.iv[i];
}
const int& operator[](int i) const {
return v.iv[i];
}
QuadInt operator-() const{
QuadInt ret;
ret -= *this;
return ret;
}
QuadInt& operator+=(QuadInt const& si){
#if OSL_USE_SSE
v.v4=__builtin_ia32_paddd128(v.v4,si.v.v4);
#else
for(int i=0;i<4;i++) v.iv[i]+=si.v.iv[i];
#endif
return *this;
}
QuadInt& operator-=(QuadInt const& si){
#if OSL_USE_SSE
v.v4=__builtin_ia32_psubd128(v.v4,si.v.v4);
#else
for(int i=0;i<4;i++) v.iv[i]-=si.v.iv[i];
#endif
return *this;
}
QuadInt& operator*=(int scale){
#if OSL_USE_SSE41
XMM val;
unsigned long long scalescale=(unsigned long long )((unsigned int)scale);
scalescale|=scalescale<<32ull;
val.v2=__builtin_ia32_vec_set_v2di(val.v2,(long long)scalescale,0);
val.v2=__builtin_ia32_vec_set_v2di(val.v2,(long long)scalescale,1);
v.v4=__builtin_ia32_pmulld128(v.v4,val.v4);
#else
for(int i=0;i<4;i++) v.iv[i]*=scale;
#endif
return *this;
}
static size_t size() { return 4; }
};
inline QuadInt operator+(QuadInt const& si0,QuadInt const& si1)
{
QuadInt ret(si0);
ret+=si1;
return ret;
}
inline QuadInt operator-(QuadInt const& si0,QuadInt const& si1)
{
QuadInt ret(si0);
ret-=si1;
return ret;
}
inline QuadInt operator*(QuadInt const& si0,int scale)
{
QuadInt ret(si0);
ret*=scale;
return ret;
}
inline bool operator==(QuadInt const& l,QuadInt const& r)
{
return l.v.llv[0] == r.v.llv[0] && l.v.llv[1] == r.v.llv[1];
}
inline bool operator<(QuadInt const& l,QuadInt const& r)
{
if (l.v.llv[0] != r.v.llv[0])
return (l.v.llv[0] < r.v.llv[0]);
return l.v.llv[1] < r.v.llv[1];
}
class QuadIntPair
{
CArray<QuadInt,2> v;
public:
QuadIntPair() {}
const QuadInt& operator[](int i) const{
return v[i];
}
const QuadInt& operator[](Player pl) const{
return v[pl];
}
QuadInt& operator[](int i){
return v[i];
}
QuadInt& operator[](Player pl){
return v[pl];
}
QuadIntPair& operator+=(QuadIntPair const& a){
v[0]+=a.v[0];
v[1]+=a.v[1];
return *this;
}
QuadIntPair& operator-=(QuadIntPair const& a){
v[0]-=a.v[0];
v[1]-=a.v[1];
return *this;
}
};
inline QuadIntPair operator+(QuadIntPair const& si0,QuadIntPair const& si1)
{
QuadIntPair ret(si0);
ret+=si1;
return ret;
}
inline QuadIntPair operator-(QuadIntPair const& si0,QuadIntPair const& si1)
{
QuadIntPair ret(si0);
ret-=si1;
return ret;
}
inline bool operator==(QuadIntPair const& l,QuadIntPair const& r)
{
return l[0] == r[0] && l[1] == r[1];
}
}
using container::QuadInt;
using container::QuadIntPair;
}
#endif // EVAL_CONTAINER_QUAD_INT_H
// ;;; Local Variables:
// ;;; mode:c++
// ;;; c-basic-offset:2
// ;;; End:
align16New.h
osl::CArray
Definition container.h:20
osl::container::QuadIntPair
Definition quadInt.h:155
osl::container::QuadIntPair::operator-=
QuadIntPair & operator-=(QuadIntPair const &a)
Definition quadInt.h:176
osl::container::QuadIntPair::operator[]
QuadInt & operator[](Player pl)
Definition quadInt.h:168
osl::container::QuadIntPair::operator[]
const QuadInt & operator[](Player pl) const
Definition quadInt.h:162
osl::container::QuadIntPair::operator[]
QuadInt & operator[](int i)
Definition quadInt.h:165
osl::container::QuadIntPair::operator[]
const QuadInt & operator[](int i) const
Definition quadInt.h:159
osl::container::QuadIntPair::QuadIntPair
QuadIntPair()
Definition quadInt.h:158
osl::container::QuadIntPair::v
CArray< QuadInt, 2 > v
Definition quadInt.h:156
osl::container::QuadIntPair::operator+=
QuadIntPair & operator+=(QuadIntPair const &a)
Definition quadInt.h:171
config.h
container.h
osl::container
Definition bitXmask.h:12
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:33
osl::container::operator+
QuadInt operator+(QuadInt const &si0, QuadInt const &si1)
Definition quadInt.h:125
osl::container::operator-
QuadInt operator-(QuadInt const &si0, QuadInt const &si1)
Definition quadInt.h:131
osl::container::operator<
bool operator<(BitXmask l, BitXmask r)
Definition bitXmask.h:41
osl
Definition additionalEffect.h:6
osl::Player
Player
Definition basic_type.h:8
osl::__attribute__
const PtypeO PTYPEO_EDGE __attribute__((unused))
osl::container::QuadInt
Definition quadInt.h:43
osl::container::QuadInt::v
union osl::container::QuadInt::XMM v
osl::container::QuadInt::operator[]
const int & operator[](int i) const
Definition quadInt.h:86
osl::container::QuadInt::clear
void clear()
Definition quadInt.h:75
osl::container::QuadInt::operator-=
QuadInt & operator-=(QuadInt const &si)
Definition quadInt.h:102
osl::container::QuadInt::operator[]
int & operator[](int i)
Definition quadInt.h:83
osl::container::QuadInt::QuadInt
QuadInt(QuadInt const &si)
Definition quadInt.h:59
osl::container::QuadInt::operator*=
QuadInt & operator*=(int scale)
Definition quadInt.h:110
osl::container::QuadInt::size
static size_t size()
Definition quadInt.h:123
osl::container::QuadInt::operator=
QuadInt & operator=(QuadInt const &si)
Definition quadInt.h:66
osl::container::QuadInt::QuadInt
QuadInt()
Definition quadInt.h:56
osl::container::QuadInt::operator-
QuadInt operator-() const
Definition quadInt.h:89
osl::container::QuadInt::operator+=
QuadInt & operator+=(QuadInt const &si)
Definition quadInt.h:94
osl::misc::Align16New
Definition align16New.h:12
osl::QuadInt::XMM::iv
CArray< int, 4 > iv
Definition quadInt.h:45
osl::QuadInt::XMM::llv
CArray< long long, 2 > llv
Definition quadInt.h:46
osl::container::QuadInt::XMM
Definition quadInt.h:44
osl::container::QuadInt::XMM::iv
CArray< int, 4 > iv
Definition quadInt.h:45
osl::container::QuadInt::XMM::llv
CArray< long long, 2 > llv
Definition quadInt.h:46