| // SPDX-License-Identifier: GPL-2.0-only |
| |
| #include "../../kselftest.h" |
| #define MAX_VSIZE (8192 * 32) |
| |
| void dump(char *ptr, int size) |
| { |
| int i = 0; |
| |
| for (i = 0; i < size; i++) { |
| if (i != 0) { |
| if (i % 16 == 0) |
| printf("\n"); |
| else if (i % 8 == 0) |
| printf(" "); |
| } |
| printf("%02x ", ptr[i]); |
| } |
| printf("\n"); |
| } |
| |
| int main(void) |
| { |
| int i; |
| unsigned long vl; |
| char *datap, *tmp; |
| |
| datap = malloc(MAX_VSIZE); |
| if (!datap) { |
| ksft_test_result_fail("fail to allocate memory for size = %d\n", MAX_VSIZE); |
| exit(-1); |
| } |
| |
| tmp = datap; |
| asm volatile ( |
| ".option push\n\t" |
| ".option arch, +v\n\t" |
| "vsetvli %0, x0, e8, m8, ta, ma\n\t" |
| "vse8.v v0, (%2)\n\t" |
| "add %1, %2, %0\n\t" |
| "vse8.v v8, (%1)\n\t" |
| "add %1, %1, %0\n\t" |
| "vse8.v v16, (%1)\n\t" |
| "add %1, %1, %0\n\t" |
| "vse8.v v24, (%1)\n\t" |
| ".option pop\n\t" |
| : "=&r" (vl), "=r" (tmp) : "r" (datap) : "memory"); |
| |
| ksft_print_msg("vl = %lu\n", vl); |
| |
| if (datap[0] != 0x00 && datap[0] != 0xff) { |
| ksft_test_result_fail("v-regesters are not properly initialized\n"); |
| dump(datap, vl * 4); |
| exit(-1); |
| } |
| |
| for (i = 1; i < vl * 4; i++) { |
| if (datap[i] != datap[0]) { |
| ksft_test_result_fail("detect stale values on v-regesters\n"); |
| dump(datap, vl * 4); |
| exit(-2); |
| } |
| } |
| |
| free(datap); |
| ksft_exit_pass(); |
| return 0; |
| } |