QDP++
sse_linalg_m_eq_scal_m_double.cc
Go to the documentation of this file.
1
6
8#include <xmmintrin.h>
9
10
11namespace QDP {
12
13 /* M = a*M a is scalar */
14 void ssed_m_eq_scal_m(REAL64* m2, REAL64* a, REAL64 *m1, int n_mat)
15 {
16 __m128d scalar;
17 __m128d tmp1;
18 __m128d tmp2;
19 __m128d tmp3;
20 __m128d tmp4;
21 __m128d tmp5;
22 __m128d tmp6;
23 __m128d tmp7;
24 __m128d tmp8;
25 __m128d tmp9;
26 __m128d tmp10;
27 __m128d tmp11;
28 __m128d tmp12;
29 __m128d tmp13;
30 __m128d tmp14;
31 __m128d tmp15;
32
33
34 // Load the scalar into low bytes of scalar
35 scalar = _mm_load_sd(a);
36
37 // cross components into tmp
38 // Zero tmp
39 tmp1 = _mm_setzero_pd();
40 tmp1 = _mm_shuffle_pd(scalar, scalar, 0x1);
41 scalar = _mm_add_pd(scalar, tmp1);
42
43 REAL64* m1_p=m1;
44 REAL64* m2_p=m2;
45
46 for(int i=0; i < n_mat; i++) {
47 tmp1= _mm_loadu_pd(m1_p);
48 tmp2= _mm_mul_pd(scalar, tmp1);
49 _mm_storeu_pd(m2_p, tmp2);
50
51 tmp3= _mm_loadu_pd(m1_p+2);
52 tmp4= _mm_mul_pd(scalar, tmp3);
53 _mm_storeu_pd(m2_p+2, tmp4);
54
55 tmp5= _mm_loadu_pd(m1_p+4);
56 tmp6= _mm_mul_pd(scalar, tmp5);
57 _mm_storeu_pd(m2_p+4, tmp6);
58
59 tmp7= _mm_loadu_pd(m1_p+6);
60 tmp8= _mm_mul_pd(scalar, tmp7);
61 _mm_storeu_pd(m2_p+6, tmp8);
62
63 tmp9= _mm_loadu_pd(m1_p+8);
64 tmp10= _mm_mul_pd(scalar, tmp9);
65 _mm_storeu_pd(m2_p+8, tmp10);
66
67 tmp11= _mm_loadu_pd(m1_p+10);
68 tmp12= _mm_mul_pd(scalar, tmp11);
69 _mm_storeu_pd(m2_p+10, tmp12);
70
71 tmp13= _mm_loadu_pd(m1_p+12);
72 tmp14= _mm_mul_pd(scalar, tmp13);
73 _mm_storeu_pd(m2_p+12, tmp14);
74
75 tmp15= _mm_loadu_pd(m1_p+14);
76 tmp4= _mm_mul_pd(scalar, tmp15);
77 _mm_storeu_pd(m2_p+14, tmp4);
78
79 tmp5= _mm_loadu_pd(m1_p+16);
80 tmp6= _mm_mul_pd(scalar, tmp5);
81 _mm_storeu_pd(m2_p+16, tmp6);
82
83 m1_p += 18; m2_p+=18;
84 }
85
86 }
87
88 /* M *= a, a is a scalar */
89 void ssed_m_muleq_scal(REAL64* m, REAL64* a, int n_mat)
90 {
91 __m128d scalar;
92 __m128d tmp1;
93 __m128d tmp2;
94 __m128d tmp3;
95 __m128d tmp4;
96 __m128d tmp5;
97 __m128d tmp6;
98 __m128d tmp7;
99 __m128d tmp8;
100 __m128d tmp9;
101 __m128d tmp10;
102 __m128d tmp11;
103 __m128d tmp12;
104 __m128d tmp13;
105 __m128d tmp14;
106 __m128d tmp15;
107
108
109 // Load the scalar into low bytes of scalar
110 scalar = _mm_load_sd(a);
111
112 // cross components into tmp
113 // Zero tmp
114 tmp1 = _mm_setzero_pd();
115 tmp1 = _mm_shuffle_pd(scalar, scalar, 0x1);
116 scalar = _mm_add_pd(scalar, tmp1);
117
118 REAL64* m1_p=m;
119
120 for(int i=0; i < n_mat; i++) {
121 tmp1= _mm_loadu_pd(m1_p);
122 tmp2= _mm_mul_pd(scalar, tmp1);
123 _mm_storeu_pd(m1_p, tmp2);
124
125 tmp3= _mm_loadu_pd(m1_p+2);
126 tmp4= _mm_mul_pd(scalar, tmp3);
127 _mm_storeu_pd(m1_p+2, tmp4);
128
129 tmp5= _mm_loadu_pd(m1_p+4);
130 tmp6= _mm_mul_pd(scalar, tmp5);
131 _mm_storeu_pd(m1_p+4, tmp6);
132
133 tmp7= _mm_loadu_pd(m1_p+6);
134 tmp8= _mm_mul_pd(scalar, tmp7);
135 _mm_storeu_pd(m1_p+6, tmp8);
136
137 tmp9= _mm_loadu_pd(m1_p+8);
138 tmp10= _mm_mul_pd(scalar, tmp9);
139 _mm_storeu_pd(m1_p+8, tmp10);
140
141 tmp11= _mm_loadu_pd(m1_p+10);
142 tmp12= _mm_mul_pd(scalar, tmp11);
143 _mm_storeu_pd(m1_p+10, tmp12);
144
145 tmp13= _mm_loadu_pd(m1_p+12);
146 tmp14= _mm_mul_pd(scalar, tmp13);
147 _mm_storeu_pd(m1_p+12, tmp14);
148
149 tmp15= _mm_loadu_pd(m1_p+14);
150 tmp4= _mm_mul_pd(scalar, tmp15);
151 _mm_storeu_pd(m1_p+14, tmp4);
152
153 tmp5= _mm_loadu_pd(m1_p+16);
154 tmp6= _mm_mul_pd(scalar, tmp5);
155 _mm_storeu_pd(m1_p+16, tmp6);
156
157 m1_p += 18;
158 }
159
160 }
161
162
163} // namespace QDP;
164
double REAL64
Yet another random number generator.
void ssed_m_muleq_scal(REAL64 *m, REAL64 *a, int n_mat)
void ssed_m_eq_scal_m(REAL64 *m2, REAL64 *a, REAL64 *m1, int n_mat)