68 __asm__
volatile(
"prefetcht0 0(%0) \n\t" : :
"r"( a ) );
69 __asm__
volatile(
"prefetcht2 0(%0) \n\t" : :
"r"( aux->b_next ) );
72 c03_0.v = _mm256_setzero_pd();
73 c03_1.v = _mm256_setzero_pd();
74 c03_2.v = _mm256_setzero_pd();
75 c03_3.v = _mm256_setzero_pd();
76 c47_0.v = _mm256_setzero_pd();
77 c47_1.v = _mm256_setzero_pd();
78 c47_2.v = _mm256_setzero_pd();
79 c47_3.v = _mm256_setzero_pd();
83 a03.v = _mm256_load_pd( (
double*)a );
85 a47.v = _mm256_load_pd( (
double*)( a + 4 ) );
87 b0.v = _mm256_load_pd( (
double*)b );
89 for ( i = 0; i < k_iter; ++i ) {
90 __asm__
volatile(
"prefetcht0 192(%0) \n\t" : :
"r"(a) );
93 A03.v = _mm256_load_pd( (
double*)( a + 8 ) );
95 c_tmp.v = _mm256_mul_pd( a03.v , b0.v );
96 c03_0.v = _mm256_add_pd( c_tmp.v, c03_0.v );
97 c_tmp.v = _mm256_mul_pd( a47.v , b0.v );
98 c47_0.v = _mm256_add_pd( c_tmp.v, c47_0.v );
101 A47.v = _mm256_load_pd( (
double*)( a + 12 ) );
104 b1.v = _mm256_shuffle_pd( b0.v, b0.v, 0x5 );
106 c_tmp.v = _mm256_mul_pd( a03.v , b1.v );
107 c03_1.v = _mm256_add_pd( c_tmp.v, c03_1.v );
108 c_tmp.v = _mm256_mul_pd( a47.v , b1.v );
109 c47_1.v = _mm256_add_pd( c_tmp.v, c47_1.v );
112 b2.v = _mm256_permute2f128_pd( b1.v, b1.v, 0x1 );
115 B0.v = _mm256_load_pd( (
double*)( b + 4 ) );
117 c_tmp.v = _mm256_mul_pd( a03.v , b2.v );
118 c03_2.v = _mm256_add_pd( c_tmp.v, c03_2.v );
119 c_tmp.v = _mm256_mul_pd( a47.v , b2.v );
120 c47_2.v = _mm256_add_pd( c_tmp.v, c47_2.v );
123 b3.v = _mm256_shuffle_pd( b2.v, b2.v, 0x5 );
125 c_tmp.v = _mm256_mul_pd( a03.v , b3.v );
126 c03_3.v = _mm256_add_pd( c_tmp.v, c03_3.v );
127 c_tmp.v = _mm256_mul_pd( a47.v , b3.v );
128 c47_3.v = _mm256_add_pd( c_tmp.v, c47_3.v );
132 __asm__
volatile(
"prefetcht0 512(%0) \n\t" : :
"r"(a) );
135 a03.v = _mm256_load_pd( (
double*)( a + 16 ) );
137 c_tmp.v = _mm256_mul_pd( A03.v , B0.v );
138 c03_0.v = _mm256_add_pd( c_tmp.v, c03_0.v );
140 b1.v = _mm256_shuffle_pd( B0.v, B0.v, 0x5 );
142 c_tmp.v = _mm256_mul_pd( A47.v , B0.v );
143 c47_0.v = _mm256_add_pd( c_tmp.v, c47_0.v );
144 c_tmp.v = _mm256_mul_pd( A03.v , b1.v );
145 c03_1.v = _mm256_add_pd( c_tmp.v, c03_1.v );
148 a47.v = _mm256_load_pd( (
double*)( a + 20 ) );
151 b2.v = _mm256_permute2f128_pd( b1.v, b1.v, 0x1 );
153 c_tmp.v = _mm256_mul_pd( A47.v , b1.v );
154 c47_1.v = _mm256_add_pd( c_tmp.v, c47_1.v );
155 c_tmp.v = _mm256_mul_pd( A03.v , b2.v );
156 c03_2.v = _mm256_add_pd( c_tmp.v, c03_2.v );
159 b3.v = _mm256_shuffle_pd( b2.v, b2.v, 0x5 );
161 c_tmp.v = _mm256_mul_pd( A47.v , b2.v );
162 c47_2.v = _mm256_add_pd( c_tmp.v, c47_2.v );
165 b0.v = _mm256_load_pd( (
double*)( b + 8 ) );
167 c_tmp.v = _mm256_mul_pd( A03.v , b3.v );
168 c03_3.v = _mm256_add_pd( c_tmp.v, c03_3.v );
169 c_tmp.v = _mm256_mul_pd( A47.v , b3.v );
170 c47_3.v = _mm256_add_pd( c_tmp.v, c47_3.v );
176 for ( i = 0; i < k_left; ++i )
178 a03.v = _mm256_load_pd( (
double*)a );
181 a47.v = _mm256_load_pd( (
double*)( a + 4 ) );
184 b0.v = _mm256_load_pd( (
double*)b );
187 c_tmp.v = _mm256_mul_pd( a03.v , b0.v );
188 c03_0.v = _mm256_add_pd( c_tmp.v, c03_0.v );
189 c_tmp.v = _mm256_mul_pd( a47.v , b0.v );
190 c47_0.v = _mm256_add_pd( c_tmp.v, c47_0.v );
193 b1.v = _mm256_shuffle_pd( b0.v, b0.v, 0x5 );
195 c_tmp.v = _mm256_mul_pd( a03.v , b1.v );
196 c03_1.v = _mm256_add_pd( c_tmp.v, c03_1.v );
197 c_tmp.v = _mm256_mul_pd( a47.v , b1.v );
198 c47_1.v = _mm256_add_pd( c_tmp.v, c47_1.v );
201 b2.v = _mm256_permute2f128_pd( b1.v, b1.v, 0x1 );
203 c_tmp.v = _mm256_mul_pd( a03.v , b2.v );
204 c03_2.v = _mm256_add_pd( c_tmp.v, c03_2.v );
205 c_tmp.v = _mm256_mul_pd( a47.v , b2.v );
206 c47_2.v = _mm256_add_pd( c_tmp.v, c47_2.v );
209 b3.v = _mm256_shuffle_pd( b2.v, b2.v, 0x5 );
211 c_tmp.v = _mm256_mul_pd( a03.v , b3.v );
212 c03_3.v = _mm256_add_pd( c_tmp.v, c03_3.v );
213 c_tmp.v = _mm256_mul_pd( a47.v , b3.v );
214 c47_3.v = _mm256_add_pd( c_tmp.v, c47_3.v );
226 tmpc03_0.v = _mm256_blend_pd( c03_0.v, c03_1.v, 0x6 );
227 tmpc03_1.v = _mm256_blend_pd( c03_1.v, c03_0.v, 0x6 );
229 tmpc03_2.v = _mm256_blend_pd( c03_2.v, c03_3.v, 0x6 );
230 tmpc03_3.v = _mm256_blend_pd( c03_3.v, c03_2.v, 0x6 );
232 tmpc47_0.v = _mm256_blend_pd( c47_0.v, c47_1.v, 0x6 );
233 tmpc47_1.v = _mm256_blend_pd( c47_1.v, c47_0.v, 0x6 );
235 tmpc47_2.v = _mm256_blend_pd( c47_2.v, c47_3.v, 0x6 );
236 tmpc47_3.v = _mm256_blend_pd( c47_3.v, c47_2.v, 0x6 );
238 c03_0.v = _mm256_permute2f128_pd( tmpc03_0.v, tmpc03_2.v, 0x30 );
239 c03_3.v = _mm256_permute2f128_pd( tmpc03_2.v, tmpc03_0.v, 0x30 );
241 c03_1.v = _mm256_permute2f128_pd( tmpc03_1.v, tmpc03_3.v, 0x30 );
242 c03_2.v = _mm256_permute2f128_pd( tmpc03_3.v, tmpc03_1.v, 0x30 );
244 c47_0.v = _mm256_permute2f128_pd( tmpc47_0.v, tmpc47_2.v, 0x30 );
245 c47_3.v = _mm256_permute2f128_pd( tmpc47_2.v, tmpc47_0.v, 0x30 );
247 c47_1.v = _mm256_permute2f128_pd( tmpc47_1.v, tmpc47_3.v, 0x30 );
248 c47_2.v = _mm256_permute2f128_pd( tmpc47_3.v, tmpc47_1.v, 0x30 );