]>
git.proxmox.com Git - ceph.git/blob - ceph/src/pmdk/src/libpmem2/x86_64/memset/memset_t_avx.c
1 // SPDX-License-Identifier: BSD-3-Clause
2 /* Copyright 2017-2020, Intel Corporation */
8 #include "pmem2_arch.h"
11 #include "memcpy_memset.h"
12 #include "memset_avx.h"
14 static force_inline
void
15 mm256_store_si256(char *dest
, unsigned idx
, __m256i src
)
17 _mm256_store_si256((__m256i
*)dest
+ idx
, src
);
20 static force_inline
void
21 memset_mov8x64b(char *dest
, __m256i ymm
, flush64b_fn flush64b
)
23 mm256_store_si256(dest
, 0, ymm
);
24 mm256_store_si256(dest
, 1, ymm
);
25 mm256_store_si256(dest
, 2, ymm
);
26 mm256_store_si256(dest
, 3, ymm
);
27 mm256_store_si256(dest
, 4, ymm
);
28 mm256_store_si256(dest
, 5, ymm
);
29 mm256_store_si256(dest
, 6, ymm
);
30 mm256_store_si256(dest
, 7, ymm
);
31 mm256_store_si256(dest
, 8, ymm
);
32 mm256_store_si256(dest
, 9, ymm
);
33 mm256_store_si256(dest
, 10, ymm
);
34 mm256_store_si256(dest
, 11, ymm
);
35 mm256_store_si256(dest
, 12, ymm
);
36 mm256_store_si256(dest
, 13, ymm
);
37 mm256_store_si256(dest
, 14, ymm
);
38 mm256_store_si256(dest
, 15, ymm
);
40 flush64b(dest
+ 0 * 64);
41 flush64b(dest
+ 1 * 64);
42 flush64b(dest
+ 2 * 64);
43 flush64b(dest
+ 3 * 64);
44 flush64b(dest
+ 4 * 64);
45 flush64b(dest
+ 5 * 64);
46 flush64b(dest
+ 6 * 64);
47 flush64b(dest
+ 7 * 64);
50 static force_inline
void
51 memset_mov4x64b(char *dest
, __m256i ymm
, flush64b_fn flush64b
)
53 mm256_store_si256(dest
, 0, ymm
);
54 mm256_store_si256(dest
, 1, ymm
);
55 mm256_store_si256(dest
, 2, ymm
);
56 mm256_store_si256(dest
, 3, ymm
);
57 mm256_store_si256(dest
, 4, ymm
);
58 mm256_store_si256(dest
, 5, ymm
);
59 mm256_store_si256(dest
, 6, ymm
);
60 mm256_store_si256(dest
, 7, ymm
);
62 flush64b(dest
+ 0 * 64);
63 flush64b(dest
+ 1 * 64);
64 flush64b(dest
+ 2 * 64);
65 flush64b(dest
+ 3 * 64);
68 static force_inline
void
69 memset_mov2x64b(char *dest
, __m256i ymm
, flush64b_fn flush64b
)
71 mm256_store_si256(dest
, 0, ymm
);
72 mm256_store_si256(dest
, 1, ymm
);
73 mm256_store_si256(dest
, 2, ymm
);
74 mm256_store_si256(dest
, 3, ymm
);
76 flush64b(dest
+ 0 * 64);
77 flush64b(dest
+ 1 * 64);
80 static force_inline
void
81 memset_mov1x64b(char *dest
, __m256i ymm
, flush64b_fn flush64b
)
83 mm256_store_si256(dest
, 0, ymm
);
84 mm256_store_si256(dest
, 1, ymm
);
86 flush64b(dest
+ 0 * 64);
89 static force_inline
void
90 memset_mov_avx(char *dest
, int c
, size_t len
,
91 flush_fn flush
, flush64b_fn flush64b
)
93 __m256i ymm
= _mm256_set1_epi8((char)c
);
95 size_t cnt
= (uint64_t)dest
& 63;
102 memset_small_avx(dest
, ymm
, cnt
, flush
);
108 while (len
>= 8 * 64) {
109 memset_mov8x64b(dest
, ymm
, flush64b
);
115 memset_mov4x64b(dest
, ymm
, flush64b
);
121 memset_mov2x64b(dest
, ymm
, flush64b
);
127 memset_mov1x64b(dest
, ymm
, flush64b
);
134 memset_small_avx(dest
, ymm
, len
, flush
);
140 memset_mov_avx_noflush(char *dest
, int c
, size_t len
)
142 LOG(15, "dest %p c %d len %zu", dest
, c
, len
);
144 memset_mov_avx(dest
, c
, len
, noflush
, noflush64b
);
148 memset_mov_avx_empty(char *dest
, int c
, size_t len
)
150 LOG(15, "dest %p c %d len %zu", dest
, c
, len
);
152 memset_mov_avx(dest
, c
, len
, flush_empty_nolog
, flush64b_empty
);
156 memset_mov_avx_clflush(char *dest
, int c
, size_t len
)
158 LOG(15, "dest %p c %d len %zu", dest
, c
, len
);
160 memset_mov_avx(dest
, c
, len
, flush_clflush_nolog
, pmem_clflush
);
164 memset_mov_avx_clflushopt(char *dest
, int c
, size_t len
)
166 LOG(15, "dest %p c %d len %zu", dest
, c
, len
);
168 memset_mov_avx(dest
, c
, len
, flush_clflushopt_nolog
,
173 memset_mov_avx_clwb(char *dest
, int c
, size_t len
)
175 LOG(15, "dest %p c %d len %zu", dest
, c
, len
);
177 memset_mov_avx(dest
, c
, len
, flush_clwb_nolog
, pmem_clwb
);