Added some operators which were missing from SSE-Float.h
[charm.git] / src / util / SSE-Float.h
1 #ifndef __SSE_FLOAT_H__
2 #define __SSE_FLOAT_H__
3
4 #include<emmintrin.h>
5 #include<iostream>
6
7
8
9 class SSEFloat
10 {
11
12    public: __m128 val; 
13            
14
15    public:
16     
17            SSEFloat() {} 
18   
19            SSEFloat(float f) { val= _mm_set1_ps(f);}
20
21            SSEFloat(float f0, float f1,float f2, float f3) {val = _mm_setr_ps(f0,f1,f2,f3);}                     
22
23            /* Arithmetic Operators*/ 
24
25            friend inline SSEFloat operator -(const SSEFloat &a) {SSEFloat c;c.val=_mm_sub_ps(_mm_setzero_ps(),a.val);return c;}
26
27            friend inline SSEFloat operator +(const SSEFloat &a, const SSEFloat &b) {SSEFloat c;c.val= _mm_add_ps(a.val,b.val);return c;}
28                 
29            friend inline SSEFloat operator -(const SSEFloat &a, const SSEFloat &b) {SSEFloat c;c.val= _mm_sub_ps(a.val,b.val);return c;}
30
31            friend inline SSEFloat operator *(const SSEFloat &a, const SSEFloat &b) {SSEFloat c;c.val= _mm_mul_ps(a.val,b.val);return c;}
32
33            friend inline SSEFloat operator /(const SSEFloat &a, const SSEFloat &b) {SSEFloat c;c.val= _mm_div_ps(a.val,b.val);return c;}
34
35            friend inline SSEFloat sqrt      (const SSEFloat &a)                  { SSEFloat c;c.val= _mm_sqrt_ps(a.val);return c;} 
36
37
38           friend inline SSEFloat operator +(float a, const SSEFloat &b) {SSEFloat c;c.val= _mm_add_ps(_mm_set1_ps(a),b.val);return c;}
39
40
41           friend inline SSEFloat operator -(float a, const SSEFloat &b) {SSEFloat c;c.val= _mm_sub_ps(_mm_set1_ps(a),b.val);return c;}
42
43           friend inline SSEFloat operator *(float a, const SSEFloat &b) {SSEFloat c;c.val= _mm_mul_ps(_mm_set1_ps(a),b.val);return c;}   
44        
45           friend inline SSEFloat operator /(float a, const SSEFloat &b) {SSEFloat c;c.val= _mm_div_ps(_mm_set1_ps(a),b.val);return c;}
46
47            inline SSEFloat& operator +=(const SSEFloat &a) {val= _mm_add_ps(val,a.val);return *this;}
48                 
49            inline SSEFloat& operator -=(const SSEFloat &a) {val= _mm_sub_ps(val,a.val);return *this;}
50
51            inline SSEFloat& operator *=(const SSEFloat &a) {val= _mm_mul_ps(val,a.val);return *this;}
52
53            inline SSEFloat& operator /=(const SSEFloat &a) {val= _mm_div_ps(val,a.val);return *this;}
54
55           /*Logical Operators*/
56
57            friend inline SSEFloat operator &(const SSEFloat &a, const SSEFloat &b) {SSEFloat c;c.val= _mm_and_ps(a.val,b.val);return c;}
58
59            friend inline SSEFloat operator |(const SSEFloat &a, const SSEFloat &b) {SSEFloat c;c.val= _mm_or_ps(a.val,b.val);return c;}
60
61            friend inline SSEFloat operator ^(const SSEFloat &a, const SSEFloat &b) {SSEFloat c;c.val= _mm_xor_ps(a.val,b.val);return c;}
62
63            friend inline SSEFloat andnot (const SSEFloat &a, const SSEFloat &b) {SSEFloat c;c.val= _mm_andnot_ps(a.val,b.val);return c;}
64
65          /*Comparison Operators*/
66
67
68             friend inline SSEFloat operator <(const SSEFloat &a, const SSEFloat &b) {SSEFloat c;c.val= _mm_cmplt_ps(a.val,b.val);return c;}
69
70             friend inline SSEFloat operator >(const SSEFloat &a, const SSEFloat &b) {SSEFloat c;c.val= _mm_cmpgt_ps(a.val,b.val);return c;}
71
72             friend inline SSEFloat operator ==(const SSEFloat &a, const SSEFloat &b) {SSEFloat c;c.val= _mm_cmpeq_ps(a.val,b.val);return c;}  
73             
74             friend inline SSEFloat operator <(const SSEFloat &a, float b) {SSEFloat c;c.val= _mm_cmplt_ps(a.val,_mm_set1_ps(b));return c;} 
75
76             friend inline SSEFloat operator >(const SSEFloat &a, float b) {SSEFloat c;c.val= _mm_cmpgt_ps(a.val,_mm_set1_ps(b));return c;}
77
78             friend inline SSEFloat max (const SSEFloat &a, SSEFloat &b) { SSEFloat c; c.val= _mm_max_ps(a.val,b.val);return c;}
79  
80
81         /*Masking Operations */
82
83            friend inline int movemask( const SSEFloat &a) {return _mm_movemask_ps(a.val);}
84
85
86         /*Store Operations*/
87
88           friend inline void storeu(float *p, const SSEFloat &a) { _mm_storeu_ps(p,a.val);}
89
90       //    friend void storeh(float *p, const SSEFloat &a) { _mm_storeh_pd(p,a.val);}
91
92
93         //   void display();
94
95
96  
97
98 };
99
100
101 /*
102 void Double::display()
103 {
104
105 storel(z,val);
106 //_mm_storeh_pd(z,val);
107 cout<<*z;
108 }
109 */
110
111 /*
112 int main()
113 {
114
115   float i[4];
116   float *p=i;
117 // __m128d t1=_mm_setr_pd(3.0,0.0); __m128d t2 = _mm_setr_pd(5.0,0.0); 
118
119   SSEFloat f1(2.0,1.0,4.0,5.0),f2(4.0,7.0,2.0,5.0),f4(25.0);
120
121   SSEFloat d3 =   (f1 * f2)  ;  
122
123   
124   storeu(p,d3);
125    
126   cout<<*p;
127
128   p++;cout<<*p;
129
130   p++;cout<<*p;
131
132   p++;cout<<*p;
133
134 //      d3 = d1 ^ d2;
135
136  // d4 = sqrt(d2);
137
138  // __m128d t =  _mm_and_pd(t1,t2);
139
140 //  cout << movemask(d3);
141 //   d3.display();
142
143   //int i = movemask(d4);
144
145   //cout<<i;
146
147 }
148
149
150 */
151
152 #endif // __SSE_FLOAT_H__