MCPcopy Create free account
hub / github.com/ashvardanian/StringZilla / sz_fill_sve

Function sz_fill_sve

include/stringzilla/memory.h:1219–1247  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

1217#endif
1218
1219SZ_PUBLIC void sz_fill_sve(sz_ptr_t target, sz_size_t length, sz_u8_t value) {
1220 svuint8_t value_vec = svdup_u8(value);
1221 sz_size_t vec_len = svcntb(); // Vector length in bytes (scalable)
1222
1223 if (length <= vec_len) {
1224 // Small buffer case: use mask to handle small writes
1225 svbool_t mask = svwhilelt_b8((sz_u64_t)0ull, (sz_u64_t)length);
1226 svst1_u8(mask, (sz_u8_t *)target, value_vec);
1227 }
1228 else {
1229 // Calculate head, body, and tail sizes
1230 sz_size_t head_length = vec_len - ((sz_size_t)target % vec_len);
1231 sz_size_t tail_length = (sz_size_t)(target + length) % vec_len;
1232 sz_size_t body_length = length - head_length - tail_length;
1233
1234 // Handle unaligned head
1235 svbool_t head_mask = svwhilelt_b8((sz_u64_t)0ull, (sz_u64_t)head_length);
1236 svst1_u8(head_mask, (sz_u8_t *)target, value_vec);
1237 target += head_length;
1238
1239 // Aligned body loop
1240 for (; body_length >= vec_len; target += vec_len, body_length -= vec_len)
1241 svst1_u8(svptrue_b8(), (sz_u8_t *)target, value_vec);
1242
1243 // Handle unaligned tail
1244 svbool_t tail_mask = svwhilelt_b8((sz_u64_t)0ull, (sz_u64_t)tail_length);
1245 svst1_u8(tail_mask, (sz_u8_t *)target, value_vec);
1246 }
1247}
1248
1249SZ_PUBLIC void sz_copy_sve(sz_ptr_t target, sz_cptr_t source, sz_size_t length) {
1250 sz_size_t vec_len = svcntb(); // Vector length in bytes

Callers 1

sz_fillFunction · 0.85

Calls

no outgoing calls

Tested by

no test coverage detected

Used in the wild real call sites across dependent graphs

searching dependent graphs…