|
| 1 | +// SPDX-License-Identifier: GPL-2.0-only |
| 2 | +/* |
| 3 | + * Get values of vector registers as soon as the program starts to test if |
| 4 | + * is properly cleaning the values before starting a new program. Vector |
| 5 | + * registers are caller saved, so no function calls may happen before reading |
| 6 | + * the values. To further ensure consistency, this file is compiled without |
| 7 | + * libc and without auto-vectorization. |
| 8 | + * |
| 9 | + * To be "clean" all values must be either all ones or all zeroes. |
| 10 | + */ |
| 11 | + |
| 12 | +#define __stringify_1(x...) #x |
| 13 | +#define __stringify(x...) __stringify_1(x) |
| 14 | + |
| 15 | +int main(int argc, char **argv) |
| 16 | +{ |
| 17 | + char prev_value = 0, value; |
| 18 | + unsigned long vl; |
| 19 | + int first = 1; |
| 20 | + |
| 21 | + asm volatile ( |
| 22 | + ".option push\n\t" |
| 23 | + ".option arch, +v\n\t" |
| 24 | + "vsetvli %[vl], x0, e8, m1, ta, ma\n\t" |
| 25 | + ".option pop\n\t" |
| 26 | + : [vl] "=r" (vl) |
| 27 | + ); |
| 28 | + |
| 29 | +#define CHECK_VECTOR_REGISTER(register) ({ \ |
| 30 | + for (int i = 0; i < vl; i++) { \ |
| 31 | + asm volatile ( \ |
| 32 | + ".option push\n\t" \ |
| 33 | + ".option arch, +v\n\t" \ |
| 34 | + "vmv.x.s %0, " __stringify(register) "\n\t" \ |
| 35 | + "vsrl.vi " __stringify(register) ", " __stringify(register) ", 8\n\t" \ |
| 36 | + ".option pop\n\t" \ |
| 37 | + : "=r" (value)); \ |
| 38 | + if (first) { \ |
| 39 | + first = 0; \ |
| 40 | + } else if (value != prev_value || !(value == 0x00 || value == 0xff)) { \ |
| 41 | + printf("Register " __stringify(register) \ |
| 42 | + " values not clean! value: %u\n", value); \ |
| 43 | + exit(-1); \ |
| 44 | + } \ |
| 45 | + prev_value = value; \ |
| 46 | + } \ |
| 47 | +}) |
| 48 | + |
| 49 | + CHECK_VECTOR_REGISTER(v0); |
| 50 | + CHECK_VECTOR_REGISTER(v1); |
| 51 | + CHECK_VECTOR_REGISTER(v2); |
| 52 | + CHECK_VECTOR_REGISTER(v3); |
| 53 | + CHECK_VECTOR_REGISTER(v4); |
| 54 | + CHECK_VECTOR_REGISTER(v5); |
| 55 | + CHECK_VECTOR_REGISTER(v6); |
| 56 | + CHECK_VECTOR_REGISTER(v7); |
| 57 | + CHECK_VECTOR_REGISTER(v8); |
| 58 | + CHECK_VECTOR_REGISTER(v9); |
| 59 | + CHECK_VECTOR_REGISTER(v10); |
| 60 | + CHECK_VECTOR_REGISTER(v11); |
| 61 | + CHECK_VECTOR_REGISTER(v12); |
| 62 | + CHECK_VECTOR_REGISTER(v13); |
| 63 | + CHECK_VECTOR_REGISTER(v14); |
| 64 | + CHECK_VECTOR_REGISTER(v15); |
| 65 | + CHECK_VECTOR_REGISTER(v16); |
| 66 | + CHECK_VECTOR_REGISTER(v17); |
| 67 | + CHECK_VECTOR_REGISTER(v18); |
| 68 | + CHECK_VECTOR_REGISTER(v19); |
| 69 | + CHECK_VECTOR_REGISTER(v20); |
| 70 | + CHECK_VECTOR_REGISTER(v21); |
| 71 | + CHECK_VECTOR_REGISTER(v22); |
| 72 | + CHECK_VECTOR_REGISTER(v23); |
| 73 | + CHECK_VECTOR_REGISTER(v24); |
| 74 | + CHECK_VECTOR_REGISTER(v25); |
| 75 | + CHECK_VECTOR_REGISTER(v26); |
| 76 | + CHECK_VECTOR_REGISTER(v27); |
| 77 | + CHECK_VECTOR_REGISTER(v28); |
| 78 | + CHECK_VECTOR_REGISTER(v29); |
| 79 | + CHECK_VECTOR_REGISTER(v30); |
| 80 | + CHECK_VECTOR_REGISTER(v31); |
| 81 | + |
| 82 | +#undef CHECK_VECTOR_REGISTER |
| 83 | + |
| 84 | + return 0; |
| 85 | +} |
0 commit comments