1 #include <stdio.h> 2 #include <sys/prctl.h> 3 4 #define N (256 + 16) 5 6 static int __attribute__((noinline)) test(int vl) 7 { 8 unsigned char buf[N]; 9 int err = 0; 10 11 for (int i = 0; i < N; ++i) { 12 buf[i] = (unsigned char)i; 13 } 14 15 asm volatile ( 16 "mov z0.b, #255\n\t" 17 "str z0, %0" 18 : : "m" (buf) : "z0", "memory"); 19 20 for (int i = 0; i < vl; ++i) { 21 if (buf[i] != 0xff) { 22 fprintf(stderr, "vl %d, index %d, expected 255, got %d\n", 23 vl, i, buf[i]); 24 err = 1; 25 } 26 } 27 28 for (int i = vl; i < N; ++i) { 29 if (buf[i] != (unsigned char)i) { 30 fprintf(stderr, "vl %d, index %d, expected %d, got %d\n", 31 vl, i, (unsigned char)i, buf[i]); 32 err = 1; 33 } 34 } 35 36 return err; 37 } 38 39 int main() 40 { 41 int err = 0; 42 43 for (int i = 16; i <= 256; i += 16) { 44 if (prctl(PR_SVE_SET_VL, i, 0, 0, 0, 0) == i) { 45 err |= test(i); 46 } 47 } 48 return err; 49 } 50