10 uint64_t
flags = SELFTEST_CPU_FLAG_RVI;
11 if (checkasm_has_float())
12 flags |= SELFTEST_CPU_FLAG_RVF;
13 if (checkasm_has_vector())
14 flags |= SELFTEST_CPU_FLAG_RVV;
90 typedef struct RiscvRegister {
95 static const RiscvRegister registers_safe[] = {
96 {
"ra", selftest_clobber_ra },
97 {
"t0", selftest_clobber_t0 },
98 {
"t1", selftest_clobber_t1 },
99 {
"t2", selftest_clobber_t2 },
100 {
"t3", selftest_clobber_t3 },
101 {
"t4", selftest_clobber_t4 },
102 {
"t5", selftest_clobber_t5 },
103 {
"t6", selftest_clobber_t6 },
104 {
"a0", selftest_clobber_a0 },
105 {
"a1", selftest_clobber_a1 },
106 {
"a2", selftest_clobber_a2 },
107 {
"a3", selftest_clobber_a3 },
108 {
"a4", selftest_clobber_a4 },
109 {
"a5", selftest_clobber_a5 },
110 {
"a6", selftest_clobber_a6 },
111 {
"a7", selftest_clobber_a7 },
115 static const RiscvRegister float_registers_safe[] = {
116 {
"ft0", selftest_clobber_ft0 },
117 {
"ft1", selftest_clobber_ft1 },
118 {
"ft2", selftest_clobber_ft2 },
119 {
"ft3", selftest_clobber_ft3 },
120 {
"ft4", selftest_clobber_ft4 },
121 {
"ft5", selftest_clobber_ft5 },
122 {
"ft6", selftest_clobber_ft6 },
123 {
"ft7", selftest_clobber_ft7 },
124 #ifdef __riscv_float_abi_soft
125 {
"fs0", selftest_clobber_fs0 },
126 {
"fs1", selftest_clobber_fs1 },
128 {
"fa0", selftest_clobber_fa0 },
129 {
"fa1", selftest_clobber_fa1 },
130 {
"fa2", selftest_clobber_fa2 },
131 {
"fa3", selftest_clobber_fa3 },
132 {
"fa4", selftest_clobber_fa4 },
133 {
"fa5", selftest_clobber_fa5 },
134 {
"fa6", selftest_clobber_fa6 },
135 {
"fa7", selftest_clobber_fa7 },
136 #ifdef __riscv_float_abi_soft
137 {
"fs2", selftest_clobber_fs2 },
138 {
"fs3", selftest_clobber_fs3 },
139 {
"fs4", selftest_clobber_fs4 },
140 {
"fs5", selftest_clobber_fs5 },
141 {
"fs6", selftest_clobber_fs6 },
142 {
"fs7", selftest_clobber_fs7 },
143 {
"fs8", selftest_clobber_fs8 },
144 {
"fs9", selftest_clobber_fs9 },
145 {
"fs10", selftest_clobber_fs10 },
146 {
"fs11", selftest_clobber_fs11 },
148 {
"ft8", selftest_clobber_ft8 },
149 {
"ft9", selftest_clobber_ft9 },
150 {
"ft10", selftest_clobber_ft10 },
151 {
"ft11", selftest_clobber_ft11 },
155 static const RiscvRegister registers_unsafe[] = {
156 {
"s0", selftest_clobber_s0 },
157 {
"s1", selftest_clobber_s1 },
158 {
"s2", selftest_clobber_s2 },
159 {
"s3", selftest_clobber_s3 },
160 {
"s4", selftest_clobber_s4 },
161 {
"s5", selftest_clobber_s5 },
162 {
"s6", selftest_clobber_s6 },
163 {
"s7", selftest_clobber_s7 },
164 {
"s8", selftest_clobber_s8 },
165 {
"s9", selftest_clobber_s9 },
166 {
"s10", selftest_clobber_s10 },
167 {
"s11", selftest_clobber_s11 },
168 {
"sp", selftest_clobber_sp },
169 {
"gp", selftest_clobber_gp },
174 static const RiscvRegister float_registers_unsafe[] = {
175 #ifndef __riscv_float_abi_soft
176 {
"fs0", selftest_clobber_fs0 },
177 {
"fs1", selftest_clobber_fs1 },
178 {
"fs2", selftest_clobber_fs2 },
179 {
"fs3", selftest_clobber_fs3 },
180 {
"fs4", selftest_clobber_fs4 },
181 {
"fs5", selftest_clobber_fs5 },
182 {
"fs6", selftest_clobber_fs6 },
183 {
"fs7", selftest_clobber_fs7 },
184 {
"fs8", selftest_clobber_fs8 },
185 {
"fs9", selftest_clobber_fs9 },
186 {
"fs10", selftest_clobber_fs10 },
187 {
"fs11", selftest_clobber_fs11 },
192 static void check_clobber(uint64_t
mask,
unsigned char letter,
193 const RiscvRegister *registers)
198 for (
int i = 0; registers[
i].name;
i++) {
211 check_clobber(SELFTEST_CPU_FLAG_RVI,
'x', registers_safe);
212 check_clobber(SELFTEST_CPU_FLAG_RVF,
'f', float_registers_safe);
218 check_clobber(SELFTEST_CPU_FLAG_RVI,
'x', registers_unsafe);
219 check_clobber(SELFTEST_CPU_FLAG_RVF,
'f', float_registers_unsafe);