Removed the if statements from the constructors to improve performance
[charm.git] / src / util / SSE-Double.h
1 #ifndef __SSE_DOUBLE_H__
2 #define __SSE_DOUBLE_H__
3
4 #include<emmintrin.h>
5
6 #include<iostream>
7
8
9
10 class SSEDouble
11 {
12
13    public: __m128d val; 
14            
15
16    public:
17     
18            SSEDouble() {} 
19   
20            SSEDouble(double d) { val= _mm_set1_pd(d);}
21
22            SSEDouble(double d0, double d1) {val = _mm_setr_pd(d0,d1);}           
23
24            /* Arithmetic Operators*/ 
25            friend inline SSEDouble operator -(const SSEDouble &a) {SSEDouble c;c.val=_mm_sub_pd(_mm_setzero_pd(),a.val);return c;}
26
27            friend inline SSEDouble operator +(const SSEDouble &a, const SSEDouble &b) {SSEDouble c;c.val= _mm_add_pd(a.val,b.val);return c;}
28                 
29            friend inline SSEDouble operator -(const SSEDouble &a, const SSEDouble &b) {SSEDouble c;c.val= _mm_sub_pd(a.val,b.val);return c;}
30
31            friend inline SSEDouble operator *(const SSEDouble &a, const SSEDouble &b) {SSEDouble c;c.val= _mm_mul_pd(a.val,b.val);return c;}
32
33            friend inline SSEDouble operator /(const SSEDouble &a, const SSEDouble &b) {SSEDouble c;c.val= _mm_div_pd(a.val,b.val);return c;}
34
35            friend inline SSEDouble sqrt      (const SSEDouble &a)                  { SSEDouble c;c.val= _mm_sqrt_pd(a.val);return c;} 
36
37
38           friend inline SSEDouble operator +(double a, const SSEDouble &b) {SSEDouble c;c.val= _mm_add_pd(_mm_set1_pd(a),b.val);return c;}
39
40
41           friend inline SSEDouble operator -(double a, const SSEDouble &b) {SSEDouble c;c.val= _mm_sub_pd(_mm_set1_pd(a),b.val);return c;}
42
43           friend inline SSEDouble operator *(double a, const SSEDouble &b) {SSEDouble c;c.val= _mm_mul_pd(_mm_set1_pd(a),b.val);return c;}   
44        
45           friend inline SSEDouble operator /(double a, const SSEDouble &b) {SSEDouble c;c.val= _mm_div_pd(_mm_set1_pd(a),b.val);return c;}
46
47            inline SSEDouble& operator +=(const SSEDouble &a) {val= _mm_add_pd(val,a.val);return *this;}
48                 
49            inline SSEDouble& operator -=(const SSEDouble &a) {val= _mm_sub_pd(val,a.val);return *this;}
50
51            inline SSEDouble& operator *=(const SSEDouble &a) {val= _mm_mul_pd(val,a.val);return *this;}
52
53            inline SSEDouble& operator /=(const SSEDouble &a) {val= _mm_div_pd(val,a.val);return *this;}
54
55            /*Logical Operators*/
56
57            friend inline SSEDouble operator &(const SSEDouble &a, const SSEDouble &b) {SSEDouble c;c.val= _mm_and_pd(a.val,b.val);return c;}
58
59            friend inline SSEDouble operator |(const SSEDouble &a, const SSEDouble &b) {SSEDouble c;c.val= _mm_or_pd(a.val,b.val);return c;}
60
61            friend inline SSEDouble operator ^(const SSEDouble &a, const SSEDouble &b) {SSEDouble c;c.val= _mm_xor_pd(a.val,b.val);return c;}
62
63            friend inline SSEDouble andnot (const SSEDouble &a, const SSEDouble &b) {SSEDouble c;c.val= _mm_andnot_pd(a.val,b.val);return c;}
64
65          /*Comparison Operators*/
66
67
68             friend inline SSEDouble operator <(const SSEDouble &a, const SSEDouble &b) {SSEDouble c;c.val= _mm_cmplt_pd(a.val,b.val);return c;}
69
70             friend inline SSEDouble operator >(const SSEDouble &a, const SSEDouble &b) {SSEDouble c;c.val= _mm_cmpgt_pd(a.val,b.val);return c;}
71
72             friend inline SSEDouble operator ==(const SSEDouble &a, const SSEDouble &b) {SSEDouble c;c.val= _mm_cmpeq_pd(a.val,b.val);return c;}  
73             
74             friend inline SSEDouble operator <(const SSEDouble &a, double b) {SSEDouble c;c.val= _mm_cmplt_pd(a.val,_mm_set1_pd(b));return c;} 
75
76             friend inline SSEDouble operator >(const SSEDouble &a, double b) {SSEDouble c;c.val= _mm_cmpgt_pd(a.val,_mm_set1_pd(b));return c;}
77
78             friend inline SSEDouble max (const SSEDouble &a, SSEDouble &b) { SSEDouble c; c.val= _mm_max_pd(a.val,b.val);return c;}
79  
80
81         /*Masking Operations */
82
83            friend inline int movemask( const SSEDouble &a) {return _mm_movemask_pd(a.val);}
84
85
86         /*Store Operations*/
87
88           friend inline void storel(double *p, const SSEDouble &a) { _mm_storel_pd(p,a.val);}
89
90           friend inline void storeh(double *p, const SSEDouble &a) { _mm_storeh_pd(p,a.val);}
91
92
93        //   void display();
94
95
96  
97
98 };
99
100
101 /*
102 void SSEDouble::display()
103 {
104
105 storel(z,val);
106 //_mm_storeh_pd(z,val);
107 cout<<*z;
108 }
109
110 int main()
111 {
112
113   double i=1.0;
114   double *p=&i;
115 // __m128d t1=_mm_setr_pd(3.0,0.0); __m128d t2 = _mm_setr_pd(5.0,0.0); 
116
117   SSEDouble d1(2.0),d2(4.0),d4(25.0);
118
119   SSEDouble d3 = (25.0/5.0) + (d1 * d2) + d4 ;  
120
121   
122   storel(p,d3);
123    
124   cout<<*p;
125 //      d3 = d1 ^ d2;
126
127  // d4 = sqrt(d2);
128
129  // __m128d t =  _mm_and_pd(t1,t2);
130
131 //  cout << movemask(d3);
132    d3.display();
133
134   //int i = movemask(d4);
135
136   //cout<<i;
137
138 }
139
140 */
141
142
143
144 #endif //__SSE_DOUBLE_H__