1 /**********************************************************************
2 Copyright(c) 2011-2015 Intel Corporation All rights reserved.
4 Redistribution and use in source and binary forms, with or without
5 modification, are permitted provided that the following conditions
7 * Redistributions of source code must retain the above copyright
8 notice, this list of conditions and the following disclaimer.
9 * Redistributions in binary form must reproduce the above copyright
10 notice, this list of conditions and the following disclaimer in
11 the documentation and/or other materials provided with the
13 * Neither the name of Intel Corporation nor the names of its
14 contributors may be used to endorse or promote products derived
15 from this software without specific prior written permission.
17 THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
18 "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
19 LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
20 A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
21 OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
22 SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
23 LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
24 DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
25 THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
26 (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
27 OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
28 **********************************************************************/
30 #include "erasure_code.h"
34 void ec_encode_data_sse(int len
, int k
, int rows
, unsigned char *g_tbls
, unsigned char **data
,
35 unsigned char **coding
)
39 ec_encode_data_base(len
, k
, rows
, g_tbls
, data
, coding
);
44 gf_4vect_dot_prod_sse(len
, k
, g_tbls
, data
, coding
);
51 gf_3vect_dot_prod_sse(len
, k
, g_tbls
, data
, coding
);
54 gf_2vect_dot_prod_sse(len
, k
, g_tbls
, data
, coding
);
57 gf_vect_dot_prod_sse(len
, k
, g_tbls
, data
, *coding
);
65 void ec_encode_data_avx(int len
, int k
, int rows
, unsigned char *g_tbls
, unsigned char **data
,
66 unsigned char **coding
)
69 ec_encode_data_base(len
, k
, rows
, g_tbls
, data
, coding
);
74 gf_4vect_dot_prod_avx(len
, k
, g_tbls
, data
, coding
);
81 gf_3vect_dot_prod_avx(len
, k
, g_tbls
, data
, coding
);
84 gf_2vect_dot_prod_avx(len
, k
, g_tbls
, data
, coding
);
87 gf_vect_dot_prod_avx(len
, k
, g_tbls
, data
, *coding
);
95 void ec_encode_data_avx2(int len
, int k
, int rows
, unsigned char *g_tbls
, unsigned char **data
,
96 unsigned char **coding
)
100 ec_encode_data_base(len
, k
, rows
, g_tbls
, data
, coding
);
105 gf_4vect_dot_prod_avx2(len
, k
, g_tbls
, data
, coding
);
106 g_tbls
+= 4 * k
* 32;
112 gf_3vect_dot_prod_avx2(len
, k
, g_tbls
, data
, coding
);
115 gf_2vect_dot_prod_avx2(len
, k
, g_tbls
, data
, coding
);
118 gf_vect_dot_prod_avx2(len
, k
, g_tbls
, data
, *coding
);
126 #ifdef HAVE_AS_KNOWS_AVX512
128 extern int gf_vect_dot_prod_avx512(int len
, int k
, unsigned char *g_tbls
, unsigned char **data
,
129 unsigned char *dest
);
130 extern int gf_2vect_dot_prod_avx512(int len
, int k
, unsigned char *g_tbls
,
131 unsigned char **data
, unsigned char **coding
);
132 extern int gf_3vect_dot_prod_avx512(int len
, int k
, unsigned char *g_tbls
,
133 unsigned char **data
, unsigned char **coding
);
134 extern int gf_4vect_dot_prod_avx512(int len
, int k
, unsigned char *g_tbls
,
135 unsigned char **data
, unsigned char **coding
);
136 extern void gf_vect_mad_avx512(int len
, int vec
, int vec_i
, unsigned char *gftbls
,
137 unsigned char *src
, unsigned char *dest
);
138 extern void gf_2vect_mad_avx512(int len
, int vec
, int vec_i
, unsigned char *gftbls
,
139 unsigned char *src
, unsigned char **dest
);
140 extern void gf_3vect_mad_avx512(int len
, int vec
, int vec_i
, unsigned char *gftbls
,
141 unsigned char *src
, unsigned char **dest
);
142 extern void gf_4vect_mad_avx512(int len
, int vec
, int vec_i
, unsigned char *gftbls
,
143 unsigned char *src
, unsigned char **dest
);
145 void ec_encode_data_avx512(int len
, int k
, int rows
, unsigned char *g_tbls
,
146 unsigned char **data
, unsigned char **coding
)
150 ec_encode_data_base(len
, k
, rows
, g_tbls
, data
, coding
);
155 gf_4vect_dot_prod_avx512(len
, k
, g_tbls
, data
, coding
);
156 g_tbls
+= 4 * k
* 32;
162 gf_3vect_dot_prod_avx512(len
, k
, g_tbls
, data
, coding
);
165 gf_2vect_dot_prod_avx512(len
, k
, g_tbls
, data
, coding
);
168 gf_vect_dot_prod_avx512(len
, k
, g_tbls
, data
, *coding
);
175 void ec_encode_data_update_avx512(int len
, int k
, int rows
, int vec_i
, unsigned char *g_tbls
,
176 unsigned char *data
, unsigned char **coding
)
179 ec_encode_data_update_base(len
, k
, rows
, vec_i
, g_tbls
, data
, coding
);
184 gf_4vect_mad_avx512(len
, k
, vec_i
, g_tbls
, data
, coding
);
185 g_tbls
+= 4 * k
* 32;
191 gf_3vect_mad_avx512(len
, k
, vec_i
, g_tbls
, data
, coding
);
194 gf_2vect_mad_avx512(len
, k
, vec_i
, g_tbls
, data
, coding
);
197 gf_vect_mad_avx512(len
, k
, vec_i
, g_tbls
, data
, *coding
);
204 #endif // HAVE_AS_KNOWS_AVX512
206 #if __WORDSIZE == 64 || _WIN64 || __x86_64__
208 void ec_encode_data_update_sse(int len
, int k
, int rows
, int vec_i
, unsigned char *g_tbls
,
209 unsigned char *data
, unsigned char **coding
)
212 ec_encode_data_update_base(len
, k
, rows
, vec_i
, g_tbls
, data
, coding
);
217 gf_6vect_mad_sse(len
, k
, vec_i
, g_tbls
, data
, coding
);
218 g_tbls
+= 6 * k
* 32;
224 gf_6vect_mad_sse(len
, k
, vec_i
, g_tbls
, data
, coding
);
227 gf_5vect_mad_sse(len
, k
, vec_i
, g_tbls
, data
, coding
);
230 gf_4vect_mad_sse(len
, k
, vec_i
, g_tbls
, data
, coding
);
233 gf_3vect_mad_sse(len
, k
, vec_i
, g_tbls
, data
, coding
);
236 gf_2vect_mad_sse(len
, k
, vec_i
, g_tbls
, data
, coding
);
239 gf_vect_mad_sse(len
, k
, vec_i
, g_tbls
, data
, *coding
);
247 void ec_encode_data_update_avx(int len
, int k
, int rows
, int vec_i
, unsigned char *g_tbls
,
248 unsigned char *data
, unsigned char **coding
)
251 ec_encode_data_update_base(len
, k
, rows
, vec_i
, g_tbls
, data
, coding
);
255 gf_6vect_mad_avx(len
, k
, vec_i
, g_tbls
, data
, coding
);
256 g_tbls
+= 6 * k
* 32;
262 gf_6vect_mad_avx(len
, k
, vec_i
, g_tbls
, data
, coding
);
265 gf_5vect_mad_avx(len
, k
, vec_i
, g_tbls
, data
, coding
);
268 gf_4vect_mad_avx(len
, k
, vec_i
, g_tbls
, data
, coding
);
271 gf_3vect_mad_avx(len
, k
, vec_i
, g_tbls
, data
, coding
);
274 gf_2vect_mad_avx(len
, k
, vec_i
, g_tbls
, data
, coding
);
277 gf_vect_mad_avx(len
, k
, vec_i
, g_tbls
, data
, *coding
);
285 void ec_encode_data_update_avx2(int len
, int k
, int rows
, int vec_i
, unsigned char *g_tbls
,
286 unsigned char *data
, unsigned char **coding
)
289 ec_encode_data_update_base(len
, k
, rows
, vec_i
, g_tbls
, data
, coding
);
293 gf_6vect_mad_avx2(len
, k
, vec_i
, g_tbls
, data
, coding
);
294 g_tbls
+= 6 * k
* 32;
300 gf_6vect_mad_avx2(len
, k
, vec_i
, g_tbls
, data
, coding
);
303 gf_5vect_mad_avx2(len
, k
, vec_i
, g_tbls
, data
, coding
);
306 gf_4vect_mad_avx2(len
, k
, vec_i
, g_tbls
, data
, coding
);
309 gf_3vect_mad_avx2(len
, k
, vec_i
, g_tbls
, data
, coding
);
312 gf_2vect_mad_avx2(len
, k
, vec_i
, g_tbls
, data
, coding
);
315 gf_vect_mad_avx2(len
, k
, vec_i
, g_tbls
, data
, *coding
);
323 #endif //__WORDSIZE == 64 || _WIN64 || __x86_64__
332 struct slver ec_init_tables_slver_00010068
;
333 struct slver ec_init_tables_slver
= { 0x0068, 0x01, 0x00 };
335 struct slver ec_encode_data_sse_slver_00020069
;
336 struct slver ec_encode_data_sse_slver
= { 0x0069, 0x02, 0x00 };