736b587112e24eb9c527f78d073457342f995fcc
1 // See LICENSE for license details.
3 #ifndef __TEST_MACROS_VECTOR_H
4 #define __TEST_MACROS_VECTOR_H
7 #define EXTRA_INIT RVTEST_VEC_ENABLE
9 #-----------------------------------------------------------------------
11 #-----------------------------------------------------------------------
13 #define TEST_CASE( testnum, testreg, correctval, code... ) \
14 TEST_CASE_NREG( testnum, 32, 32, testreg, correctval, code )
16 # We use j fail, because for some cases branches are not enough to jump to fail
18 #define TEST_CASE_NREG( testnum, nxreg, nfreg, testreg, correctval, code... ) \
20 vsetcfg nxreg,nfreg; \
23 lui a0,%hi(vtcode ## testnum ); \
24 vf %lo(vtcode ## testnum )(a0); \
26 vsd v ## testreg, a4; \
30 li TESTNUM, testnum; \
31 test_loop ## testnum: \
33 beq a0,a1,skip ## testnum; \
38 bne a2,a3,test_loop ## testnum; \
45 # We use a macro hack to simpify code generation for various numbers
48 #define TEST_INSERT_NOPS_0
49 #define TEST_INSERT_NOPS_1 nop; TEST_INSERT_NOPS_0
50 #define TEST_INSERT_NOPS_2 nop; TEST_INSERT_NOPS_1
51 #define TEST_INSERT_NOPS_3 nop; TEST_INSERT_NOPS_2
52 #define TEST_INSERT_NOPS_4 nop; TEST_INSERT_NOPS_3
53 #define TEST_INSERT_NOPS_5 nop; TEST_INSERT_NOPS_4
54 #define TEST_INSERT_NOPS_6 nop; TEST_INSERT_NOPS_5
55 #define TEST_INSERT_NOPS_7 nop; TEST_INSERT_NOPS_6
56 #define TEST_INSERT_NOPS_8 nop; TEST_INSERT_NOPS_7
57 #define TEST_INSERT_NOPS_9 nop; TEST_INSERT_NOPS_8
58 #define TEST_INSERT_NOPS_10 nop; TEST_INSERT_NOPS_9
61 #-----------------------------------------------------------------------
63 #-----------------------------------------------------------------------
65 #-----------------------------------------------------------------------
66 # Tests for instructions with immediate operand
67 #-----------------------------------------------------------------------
69 #define SEXT_IMM(x) ((x) | (-(((x) >> 11) & 1) << 11))
71 #define TEST_IMM_OP( testnum, inst, result, val1, imm ) \
72 TEST_CASE_NREG( testnum, 4, 0, x3, result, \
74 inst x3, x1, SEXT_IMM(imm); \
77 #define TEST_IMM_SRC1_EQ_DEST( testnum, inst, result, val1, imm ) \
78 TEST_CASE_NREG( testnum, 2, 0, x1, result, \
80 inst x1, x1, SEXT_IMM(imm); \
83 #define TEST_IMM_DEST_BYPASS( testnum, nop_cycles, inst, result, val1, imm ) \
84 TEST_CASE_NREG( testnum, 5, 0, x4, result, \
86 inst x3, x1, SEXT_IMM(imm); \
87 TEST_INSERT_NOPS_ ## nop_cycles \
91 #define TEST_IMM_SRC1_BYPASS( testnum, nop_cycles, inst, result, val1, imm ) \
92 TEST_CASE_NREG( testnum, 4, 0, x3, result, \
94 TEST_INSERT_NOPS_ ## nop_cycles \
95 inst x3, x1, SEXT_IMM(imm); \
98 #define TEST_IMM_ZEROSRC1( testnum, inst, result, imm ) \
99 TEST_CASE_NREG( testnum, 2, 0, x1, result, \
100 inst x1, x0, SEXT_IMM(imm); \
103 #define TEST_IMM_ZERODEST( testnum, inst, val1, imm ) \
104 TEST_CASE_NREG( testnum, 2, 0, x0, 0, \
106 inst x0, x1, SEXT_IMM(imm); \
109 #-----------------------------------------------------------------------
110 # Tests for an instruction with register operands
111 #-----------------------------------------------------------------------
113 #define TEST_R_OP( testnum, inst, result, val1 ) \
114 TEST_CASE_NREG( testnum, 4, 0, x3, result, \
119 #define TEST_R_SRC1_EQ_DEST( testnum, inst, result, val1 ) \
120 TEST_CASE_NREG( testnum, 2, 0, x1, result, \
125 #define TEST_R_DEST_BYPASS( testnum, nop_cycles, inst, result, val1 ) \
126 TEST_CASE_NREG( testnum, 5, 0, x4, result, \
129 TEST_INSERT_NOPS_ ## nop_cycles \
133 #-----------------------------------------------------------------------
134 # Tests for an instruction with register-register operands
135 #-----------------------------------------------------------------------
137 #define TEST_RR_OP( testnum, inst, result, val1, val2 ) \
138 TEST_CASE_NREG( testnum, 4, 0, x3, result, \
144 #define TEST_RR_SRC1_EQ_DEST( testnum, inst, result, val1, val2 ) \
145 TEST_CASE_NREG( testnum, 3, 0, x1, result, \
151 #define TEST_RR_SRC2_EQ_DEST( testnum, inst, result, val1, val2 ) \
152 TEST_CASE_NREG( testnum, 3, 0, x2, result, \
158 #define TEST_RR_SRC12_EQ_DEST( testnum, inst, result, val1 ) \
159 TEST_CASE_NREG( testnum, 2, 0, x1, result, \
164 #define TEST_RR_DEST_BYPASS( testnum, nop_cycles, inst, result, val1, val2 ) \
165 TEST_CASE_NREG( testnum, 5, 0, x4, result, \
169 TEST_INSERT_NOPS_ ## nop_cycles \
173 #define TEST_RR_SRC12_BYPASS( testnum, src1_nops, src2_nops, inst, result, val1, val2 ) \
174 TEST_CASE_NREG( testnum, 4, 0, x3, result, \
176 TEST_INSERT_NOPS_ ## src1_nops \
178 TEST_INSERT_NOPS_ ## src2_nops \
182 #define TEST_RR_SRC21_BYPASS( testnum, src1_nops, src2_nops, inst, result, val1, val2 ) \
183 TEST_CASE_NREG( testnum, 4, 0, x3, result, \
185 TEST_INSERT_NOPS_ ## src1_nops \
187 TEST_INSERT_NOPS_ ## src2_nops \
191 #define TEST_RR_ZEROSRC1( testnum, inst, result, val ) \
192 TEST_CASE_NREG( testnum, 3, 0, x2, result, \
197 #define TEST_RR_ZEROSRC2( testnum, inst, result, val ) \
198 TEST_CASE_NREG( testnum, 3, 0, x2, result, \
203 #define TEST_RR_ZEROSRC12( testnum, inst, result ) \
204 TEST_CASE_NREG( testnum, 2, 0, x1, result, \
208 #define TEST_RR_ZERODEST( testnum, inst, val1, val2 ) \
209 TEST_CASE_NREG( testnum, 3, 0, x0, 0, \
216 #-----------------------------------------------------------------------
218 #-----------------------------------------------------------------------
220 #-----------------------------------------------------------------------
221 # Tests floating-point instructions
222 #-----------------------------------------------------------------------
224 #define TEST_FP_OP_S_INTERNAL_NREG( testnum, nxreg, nfreg, result, val1, val2, val3, code... ) \
226 vsetcfg nxreg,nfreg; \
229 la a5, test_ ## testnum ## _data ;\
230 vflstw vf0, a5, x0; \
232 vflstw vf1, a5, x0; \
234 vflstw vf2, a5, x0; \
236 lui a0,%hi(vtcode ## testnum ); \
237 vf %lo(vtcode ## testnum )(a0); \
243 li TESTNUM, testnum; \
244 test_loop ## testnum: \
246 beq a0,a1,skip ## testnum; \
251 bne a2,a3,test_loop ## testnum; \
253 vtcode ## testnum : \
257 test_ ## testnum ## _data: \
264 #define TEST_FP_OP_D_INTERNAL_NREG( testnum, nxreg, nfreg, result, val1, val2, val3, code... ) \
266 vsetcfg nxreg,nfreg; \
269 la a5, test_ ## testnum ## _data ;\
270 vflstd vf0, a5, x0; \
272 vflstd vf1, a5, x0; \
274 vflstd vf2, a5, x0; \
276 lui a0,%hi(vtcode ## testnum ); \
277 vf %lo(vtcode ## testnum )(a0); \
283 li TESTNUM, testnum; \
284 test_loop ## testnum: \
286 beq a0,a1,skip ## testnum; \
291 bne a2,a3,test_loop ## testnum; \
293 vtcode ## testnum : \
297 test_ ## testnum ## _data: \
304 #define TEST_FCVT_S_D( testnum, result, val1 ) \
305 TEST_FP_OP_D_INTERNAL_NREG( testnum, 2, 4, double result, val1, 0.0, 0.0, \
306 fcvt.s.d f3, f0; fcvt.d.s f3, f3; fmv.x.d x1, f3)
308 #define TEST_FCVT_D_S( testnum, result, val1 ) \
309 TEST_FP_OP_S_INTERNAL_NREG( testnum, 2, 4, float result, val1, 0.0, 0.0, \
310 fcvt.d.s f3, f0; fcvt.s.d f3, f3; fmv.x.s x1, f3)
312 #define TEST_FP_OP2_S( testnum, inst, flags, result, val1, val2 ) \
313 TEST_FP_OP_S_INTERNAL_NREG( testnum, 2, 4, float result, val1, val2, 0.0, \
314 inst f3, f0, f1; fmv.x.s x1, f3)
316 #define TEST_FP_OP2_D( testnum, inst, flags, result, val1, val2 ) \
317 TEST_FP_OP_D_INTERNAL_NREG( testnum, 2, 4, double result, val1, val2, 0.0, \
318 inst f3, f0, f1; fmv.x.d x1, f3)
320 #define TEST_FP_OP3_S( testnum, inst, flags, result, val1, val2, val3 ) \
321 TEST_FP_OP_S_INTERNAL_NREG( testnum, 2, 4, float result, val1, val2, val3, \
322 inst f3, f0, f1, f2; fmv.x.s x1, f3)
324 #define TEST_FP_OP3_D( testnum, inst, flags, result, val1, val2, val3 ) \
325 TEST_FP_OP_D_INTERNAL_NREG( testnum, 2, 4, double result, val1, val2, val3, \
326 inst f3, f0, f1, f2; fmv.x.d x1, f3)
328 #define TEST_FP_INT_OP_S( testnum, inst, flags, result, val1, rm ) \
329 TEST_FP_OP_S_INTERNAL_NREG( testnum, 2, 4, word result, val1, 0.0, 0.0, \
332 #define TEST_FP_INT_OP_D( testnum, inst, flags, result, val1, rm ) \
333 TEST_FP_OP_D_INTERNAL_NREG( testnum, 2, 4, dword result, val1, 0.0, 0.0, \
336 #define TEST_FP_CMP_OP_S( testnum, inst, result, val1, val2 ) \
337 TEST_FP_OP_S_INTERNAL_NREG( testnum, 2, 4, word result, val1, val2, 0.0, \
340 #define TEST_FP_CMP_OP_D( testnum, inst, result, val1, val2 ) \
341 TEST_FP_OP_D_INTERNAL_NREG( testnum, 2, 4, dword result, val1, val2, 0.0, \
344 #define TEST_INT_FP_OP_S( testnum, inst, result, val1 ) \
349 lui a0,%hi(vtcode ## testnum ); \
350 vf %lo(vtcode ## testnum )(a0); \
354 la a5, test_ ## testnum ## _data ;\
357 li TESTNUM, testnum; \
358 test_loop ## testnum: \
360 beq a0,a1,skip ## testnum; \
365 bne a2,a3,test_loop ## testnum; \
367 vtcode ## testnum : \
373 test_ ## testnum ## _data: \
377 #define TEST_INT_FP_OP_D( testnum, inst, result, val1 ) \
382 lui a0,%hi(vtcode ## testnum ); \
383 vf %lo(vtcode ## testnum )(a0); \
387 la a5, test_ ## testnum ## _data ;\
390 li TESTNUM, testnum; \
391 test_loop ## testnum: \
393 beq a0,a1,skip ## testnum; \
398 bne a2,a3,test_loop ## testnum; \
400 vtcode ## testnum : \
406 test_ ## testnum ## _data: \
411 #-----------------------------------------------------------------------
413 #-----------------------------------------------------------------------
415 #-----------------------------------------------------------------------
416 # Test branch instructions
417 #-----------------------------------------------------------------------
419 #define TEST_BR2_OP_TAKEN( testnum, inst, val1, val2) \
420 TEST_CASE_NREG( testnum, 4, 0, x3, 0, \
428 2: inst x1, x2, 1b; \
433 #define TEST_BR2_OP_NOTTAKEN( testnum, inst, val1, val2 ) \
434 TEST_CASE_NREG( testnum, 4, 0, x3, 0, \
442 2: inst x1, x2, 1b; \
446 #define TEST_BR2_SRC12_BYPASS( testnum, src1_nops, src2_nops, inst, val1, val2 ) \
447 TEST_CASE_NREG( testnum, 6, 0, x3, 0, \
451 TEST_INSERT_NOPS_ ## src1_nops \
453 TEST_INSERT_NOPS_ ## src2_nops \
463 #define TEST_BR2_SRC21_BYPASS( testnum, src1_nops, src2_nops, inst, val1, val2 ) \
464 TEST_CASE_NREG( testnum, 6, 0, x3, 0, \
468 TEST_INSERT_NOPS_ ## src1_nops \
470 TEST_INSERT_NOPS_ ## src2_nops \
480 #define TEST_BR2_DIVERGED_ODD_EVEN( testnum, inst, n, result, code...) \
481 TEST_CASE_NREG( testnum, 5, 0, x3, result, \
497 #define TEST_BR2_DIVERGED_FULL12( testnum, inst, n, result, code... ) \
498 TEST_CASE_NREG( testnum, 5, 0, x3, result, \
512 #define TEST_BR2_DIVERGED_FULL21( testnum, inst, n, result, code... ) \
513 TEST_CASE_NREG( testnum, 5, 0, x3, result, \
527 #define TEST_CASE_NREG_MEM( testnum, nxreg, nfreg, correctval, code... ) \
529 vsetcfg nxreg,nfreg; \
532 lui a0,%hi(vtcode ## testnum ); \
533 vf %lo(vtcode ## testnum )(a0); \
538 li TESTNUM, testnum; \
539 test_loop ## testnum: \
541 beq a0,a1,skip ## testnum; \
546 bne a2,a3,test_loop ## testnum; \
548 vtcode ## testnum : \
553 #define TEST_BR2_DIVERGED_MEM_FULL12( testnum, inst, n) \
554 TEST_CASE_NREG_MEM( testnum, 7, 0, 1, \
574 #define TEST_BR2_DIVERGED_MEM_FULL21( testnum, inst, n) \
575 TEST_CASE_NREG_MEM( testnum, 7, 0, 1, \
595 #-----------------------------------------------------------------------
596 # Pass and fail code (assumes test num is in TESTNUM)
597 #-----------------------------------------------------------------------
599 #define TEST_PASSFAIL \
600 bne x0, TESTNUM, pass; \
607 #-----------------------------------------------------------------------
609 #-----------------------------------------------------------------------