| 1247 | } |
| 1248 | |
| 1249 | SZ_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 | |
| 1285 | SZ_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 |
no outgoing calls
no test coverage detected
searching dependent graphs…