| 1217 | #endif |
| 1218 | |
| 1219 | SZ_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 | |
| 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 |
no outgoing calls
no test coverage detected
searching dependent graphs…