1 /* chunkset_power8.c -- VSX inline functions to copy small data chunks.
2  * For conditions of distribution and use, see copyright notice in zlib.h
3  */
4 
5 #ifdef POWER8_VSX_CHUNKSET
6 #include <altivec.h>
7 #include "../../zbuild.h"
8 
9 typedef vector unsigned char chunk_t;
10 
11 #define CHUNK_SIZE 16
12 
13 #define HAVE_CHUNKMEMSET_2
14 #define HAVE_CHUNKMEMSET_4
15 #define HAVE_CHUNKMEMSET_8
16 
chunkmemset_2(uint8_t * from,chunk_t * chunk)17 static inline void chunkmemset_2(uint8_t *from, chunk_t *chunk) {
18     uint16_t tmp;
19     zmemcpy_2(&tmp, from);
20     *chunk = (vector unsigned char)vec_splats(tmp);
21 }
22 
chunkmemset_4(uint8_t * from,chunk_t * chunk)23 static inline void chunkmemset_4(uint8_t *from, chunk_t *chunk) {
24     uint32_t tmp;
25     zmemcpy_4(&tmp, from);
26     *chunk = (vector unsigned char)vec_splats(tmp);
27 }
28 
chunkmemset_8(uint8_t * from,chunk_t * chunk)29 static inline void chunkmemset_8(uint8_t *from, chunk_t *chunk) {
30     uint64_t tmp;
31     zmemcpy_8(&tmp, from);
32     *chunk = (vector unsigned char)vec_splats(tmp);
33 }
34 
35 #define CHUNKSIZE        chunksize_power8
36 #define CHUNKCOPY        chunkcopy_power8
37 #define CHUNKCOPY_SAFE   chunkcopy_safe_power8
38 #define CHUNKUNROLL      chunkunroll_power8
39 #define CHUNKMEMSET      chunkmemset_power8
40 #define CHUNKMEMSET_SAFE chunkmemset_safe_power8
41 
loadchunk(uint8_t const * s,chunk_t * chunk)42 static inline void loadchunk(uint8_t const *s, chunk_t *chunk) {
43     *chunk = vec_xl(0, s);
44 }
45 
storechunk(uint8_t * out,chunk_t * chunk)46 static inline void storechunk(uint8_t *out, chunk_t *chunk) {
47     vec_xst(*chunk, 0, out);
48 }
49 
50 #include "chunkset_tpl.h"
51 
52 #endif
53