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

Function sz_copy_sve

include/stringzilla/memory.h:1249–1283  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

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
1251
1252 // When the buffer is small, there isn't much to innovate.
1253 if (length <= vec_len) {
1254 // Small buffer case: use mask to handle small writes
1255 svbool_t mask = svwhilelt_b8((sz_u64_t)0ull, (sz_u64_t)length);
1256 svuint8_t data = svld1_u8(mask, (sz_u8_t *)source);
1257 svst1_u8(mask, (sz_u8_t *)target, data);
1258 }
1259 // Slightly larger buffers
1260 else if (2 * length <= vec_len) {
1261 svbool_t mask_first = svptrue_b8();
1262 svbool_t mask_second = svwhilelt_b8((sz_u64_t)vec_len, (sz_u64_t)length);
1263 svuint8_t data_first = svld1_u8(mask_first, (sz_u8_t *)(source));
1264 svuint8_t data_second = svld1_u8(mask_second, (sz_u8_t *)(source + vec_len));
1265 svst1_u8(mask_first, (sz_u8_t *)(target), data_first);
1266 svst1_u8(mask_second, (sz_u8_t *)(target + vec_len), data_second);
1267 }
1268 // For medium-sized buffers, use unidirectional traversal without non-temporal operations
1269 else {
1270 // Main loop: full vector copies
1271 for (; length >= vec_len; source += vec_len, target += vec_len, length -= vec_len) {
1272 svuint8_t data = svld1_u8(svptrue_b8(), (sz_u8_t const *)source);
1273 svst1_u8(svptrue_b8(), (sz_u8_t *)target, data);
1274 }
1275
1276 // Tail: single masked copy for remainder
1277 if (length) {
1278 svbool_t mask = svwhilelt_b8((sz_u64_t)0ull, (sz_u64_t)length);
1279 svuint8_t data = svld1_u8(mask, (sz_u8_t const *)source);
1280 svst1_u8(mask, (sz_u8_t *)target, data);
1281 }
1282 }
1283}
1284
1285SZ_PUBLIC void sz_move_sve(sz_ptr_t target, sz_cptr_t source, sz_size_t length) {
1286 sz_size_t vec_len = svcntb(); // Vector length in bytes

Callers 2

sz_copyFunction · 0.70

Calls

no outgoing calls

Tested by

no test coverage detected

Used in the wild real call sites across dependent graphs

searching dependent graphs…