Removed the if statements from the constructors to improve performance
[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, const SSEFloat &b) {SSEFloat c;c.val= _mm_add_ps(a.val,b.val);return c;}
26                 
27            friend inline SSEFloat operator -(const SSEFloat &a, const SSEFloat &b) {SSEFloat c;c.val= _mm_sub_ps(a.val,b.val);return c;}
28
29            friend inline SSEFloat operator *(const SSEFloat &a, const SSEFloat &b) {SSEFloat c;c.val= _mm_mul_ps(a.val,b.val);return c;}
30
31            friend inline SSEFloat operator /(const SSEFloat &a, const SSEFloat &b) {SSEFloat c;c.val= _mm_div_ps(a.val,b.val);return c;}
32
33            friend inline SSEFloat sqrt      (const SSEFloat &a)                  { SSEFloat c;c.val= _mm_sqrt_ps(a.val);return c;} 
34
35
36           friend inline SSEFloat operator +(float a, const SSEFloat &b) {SSEFloat c;c.val= _mm_add_ps(_mm_set1_ps(a),b.val);return c;}
37
38
39           friend inline SSEFloat operator -(float a, const SSEFloat &b) {SSEFloat c;c.val= _mm_sub_ps(_mm_set1_ps(a),b.val);return c;}
40
41           friend inline SSEFloat operator *(float a, const SSEFloat &b) {SSEFloat c;c.val= _mm_mul_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_div_ps(_mm_set1_ps(a),b.val);return c;}
44           /*Logical Operators*/
45
46            friend inline SSEFloat operator &(const SSEFloat &a, const SSEFloat &b) {SSEFloat c;c.val= _mm_and_ps(a.val,b.val);return c;}
47
48            friend inline SSEFloat operator |(const SSEFloat &a, const SSEFloat &b) {SSEFloat c;c.val= _mm_or_ps(a.val,b.val);return c;}
49
50            friend inline SSEFloat operator ^(const SSEFloat &a, const SSEFloat &b) {SSEFloat c;c.val= _mm_xor_ps(a.val,b.val);return c;}
51
52            friend inline SSEFloat andnot (const SSEFloat &a, const SSEFloat &b) {SSEFloat c;c.val= _mm_andnot_ps(a.val,b.val);return c;}
53
54          /*Comparison Operators*/
55
56
57             friend inline SSEFloat operator <(const SSEFloat &a, const SSEFloat &b) {SSEFloat c;c.val= _mm_cmplt_ps(a.val,b.val);return c;}
58
59             friend inline SSEFloat operator >(const SSEFloat &a, const SSEFloat &b) {SSEFloat c;c.val= _mm_cmpgt_ps(a.val,b.val);return c;}
60
61             friend inline SSEFloat operator ==(const SSEFloat &a, const SSEFloat &b) {SSEFloat c;c.val= _mm_cmpeq_ps(a.val,b.val);return c;}  
62             
63             friend inline SSEFloat operator <(const SSEFloat &a, float b) {SSEFloat c;c.val= _mm_cmplt_ps(a.val,_mm_set1_ps(b));return c;} 
64
65             friend inline SSEFloat operator >(const SSEFloat &a, float b) {SSEFloat c;c.val= _mm_cmpgt_ps(a.val,_mm_set1_ps(b));return c;}
66
67             friend inline SSEFloat max (const SSEFloat &a, SSEFloat &b) { SSEFloat c; c.val= _mm_max_ps(a.val,b.val);return c;}
68  
69
70         /*Masking Operations */
71
72            friend inline int movemask( const SSEFloat &a) {return _mm_movemask_ps(a.val);}
73
74
75         /*Store Operations*/
76
77           friend inline void storeu(float *p, const SSEFloat &a) { _mm_storeu_ps(p,a.val);}
78
79       //    friend void storeh(float *p, const SSEFloat &a) { _mm_storeh_pd(p,a.val);}
80
81
82         //   void display();
83
84
85  
86
87 };
88
89
90 /*
91 void Double::display()
92 {
93
94 storel(z,val);
95 //_mm_storeh_pd(z,val);
96 cout<<*z;
97 }
98 */
99
100 /*
101 int main()
102 {
103
104   float i[4];
105   float *p=i;
106 // __m128d t1=_mm_setr_pd(3.0,0.0); __m128d t2 = _mm_setr_pd(5.0,0.0); 
107
108   SSEFloat f1(2.0,1.0,4.0,5.0),f2(4.0,7.0,2.0,5.0),f4(25.0);
109
110   SSEFloat d3 =   (f1 * f2)  ;  
111
112   
113   storeu(p,d3);
114    
115   cout<<*p;
116
117   p++;cout<<*p;
118
119   p++;cout<<*p;
120
121   p++;cout<<*p;
122
123 //      d3 = d1 ^ d2;
124
125  // d4 = sqrt(d2);
126
127  // __m128d t =  _mm_and_pd(t1,t2);
128
129 //  cout << movemask(d3);
130 //   d3.display();
131
132   //int i = movemask(d4);
133
134   //cout<<i;
135
136 }
137
138
139 */
140
141 #endif // __SSE_FLOAT_H__