1 #ifndef __TEST_MACROS_VECTOR_H
2 #define __TEST_MACROS_VECTOR_H
10 #-----------------------------------------------------------------------
12 #-----------------------------------------------------------------------
14 #define TEST_CASE( testnum, testreg, correctval, code... ) \
15 TEST_CASE_NREG( testnum, 32, 32, testreg, correctval, code )
17 # We use j fail, because for some cases branches are not enough to jump to fail
19 #define TEST_CASE_NREG( testnum, nxreg, nfreg, testreg, correctval, code... ) \
22 vvcfgivl a3,a3,nxreg,nfreg; \
23 lui a0,%hi(vtcode ## testnum ); \
24 vf %lo(vtcode ## testnum )(a0); \
26 vsd v ## testreg, a4; \
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
60 #-----------------------------------------------------------------------
61 # Tests for instructions with immediate operand
62 #-----------------------------------------------------------------------
64 #define TEST_IMM_OP( testnum, inst, result, val1, imm ) \
65 TEST_CASE_NREG( testnum, 4, 0, x3, result, \
70 #define TEST_IMM_SRC1_EQ_DEST( testnum, inst, result, val1, imm ) \
71 TEST_CASE_NREG( testnum, 2, 0, x1, result, \
76 #define TEST_IMM_DEST_BYPASS( testnum, nop_cycles, inst, result, val1, imm ) \
77 TEST_CASE_NREG( testnum, 5, 0, x4, result, \
80 TEST_INSERT_NOPS_ ## nop_cycles \
84 #define TEST_IMM_SRC1_BYPASS( testnum, nop_cycles, inst, result, val1, imm ) \
85 TEST_CASE_NREG( testnum, 4, 0, x3, result, \
87 TEST_INSERT_NOPS_ ## nop_cycles \
91 #define TEST_IMM_ZEROSRC1( testnum, inst, result, imm ) \
92 TEST_CASE_NREG( testnum, 2, 0, x1, result, \
96 #define TEST_IMM_ZERODEST( testnum, inst, val1, imm ) \
97 TEST_CASE_NREG( testnum, 2, 0, x0, 0, \
102 #-----------------------------------------------------------------------
103 # Tests for an instruction with register operands
104 #-----------------------------------------------------------------------
106 #define TEST_R_OP( testnum, inst, result, val1 ) \
107 TEST_CASE_NREG( testnum, 4, 0, x3, result, \
112 #define TEST_R_SRC1_EQ_DEST( testnum, inst, result, val1 ) \
113 TEST_CASE_NREG( testnum, 2, 0, x1, result, \
118 #define TEST_R_DEST_BYPASS( testnum, nop_cycles, inst, result, val1 ) \
119 TEST_CASE_NREG( testnum, 5, 0, x4, result, \
122 TEST_INSERT_NOPS_ ## nop_cycles \
126 #-----------------------------------------------------------------------
127 # Tests for an instruction with register-register operands
128 #-----------------------------------------------------------------------
130 #define TEST_RR_OP( testnum, inst, result, val1, val2 ) \
131 TEST_CASE_NREG( testnum, 4, 0, x3, result, \
137 #define TEST_RR_SRC1_EQ_DEST( testnum, inst, result, val1, val2 ) \
138 TEST_CASE_NREG( testnum, 3, 0, x1, result, \
144 #define TEST_RR_SRC2_EQ_DEST( testnum, inst, result, val1, val2 ) \
145 TEST_CASE_NREG( testnum, 3, 0, x2, result, \
151 #define TEST_RR_SRC12_EQ_DEST( testnum, inst, result, val1 ) \
152 TEST_CASE_NREG( testnum, 2, 0, x1, result, \
157 #define TEST_RR_DEST_BYPASS( testnum, nop_cycles, inst, result, val1, val2 ) \
158 TEST_CASE_NREG( testnum, 5, 0, x4, result, \
162 TEST_INSERT_NOPS_ ## nop_cycles \
166 #define TEST_RR_SRC12_BYPASS( testnum, src1_nops, src2_nops, inst, result, val1, val2 ) \
167 TEST_CASE_NREG( testnum, 4, 0, x3, result, \
169 TEST_INSERT_NOPS_ ## src1_nops \
171 TEST_INSERT_NOPS_ ## src2_nops \
175 #define TEST_RR_SRC21_BYPASS( testnum, src1_nops, src2_nops, inst, result, val1, val2 ) \
176 TEST_CASE_NREG( testnum, 4, 0, x3, result, \
178 TEST_INSERT_NOPS_ ## src1_nops \
180 TEST_INSERT_NOPS_ ## src2_nops \
184 #define TEST_RR_ZEROSRC1( testnum, inst, result, val ) \
185 TEST_CASE_NREG( testnum, 3, 0, x2, result, \
190 #define TEST_RR_ZEROSRC2( testnum, inst, result, val ) \
191 TEST_CASE_NREG( testnum, 3, 0, x2, result, \
196 #define TEST_RR_ZEROSRC12( testnum, inst, result ) \
197 TEST_CASE_NREG( testnum, 2, 0, x1, result, \
201 #define TEST_RR_ZERODEST( testnum, inst, val1, val2 ) \
202 TEST_CASE_NREG( testnum, 3, 0, x0, 0, \
208 #-----------------------------------------------------------------------
209 # Test branch instructions
210 #-----------------------------------------------------------------------
212 #define TEST_BR2_OP_TAKEN( testnum, inst, val1, val2) \
213 TEST_CASE_NREG( testnum, 4, 0, x3, 0, \
221 2: inst x1, x2, 1b; \
226 #define TEST_BR2_OP_NOTTAKEN( testnum, inst, val1, val2 ) \
227 TEST_CASE_NREG( testnum, 4, 0, x3, 0, \
235 2: inst x1, x2, 1b; \
239 #define TEST_BR2_SRC12_BYPASS( testnum, src1_nops, src2_nops, inst, val1, val2 ) \
240 TEST_CASE_NREG( testnum, 6, 0, x3, 0, \
244 TEST_INSERT_NOPS_ ## src1_nops \
246 TEST_INSERT_NOPS_ ## src2_nops \
256 #define TEST_BR2_SRC21_BYPASS( testnum, src1_nops, src2_nops, inst, val1, val2 ) \
257 TEST_CASE_NREG( testnum, 6, 0, x3, 0, \
261 TEST_INSERT_NOPS_ ## src1_nops \
263 TEST_INSERT_NOPS_ ## src2_nops \
273 #define TEST_BR2_DIVERGED_ODD_EVEN( testnum, inst, n, result, code...) \
274 TEST_CASE_NREG( testnum, 5, 0, x3, result, \
290 #define TEST_BR2_DIVERGED_FULL12( testnum, inst, n, result, code... ) \
291 TEST_CASE_NREG( testnum, 5, 0, x3, result, \
305 #define TEST_BR2_DIVERGED_FULL21( testnum, inst, n, result, code... ) \
306 TEST_CASE_NREG( testnum, 5, 0, x3, result, \
320 #define TEST_CASE_NREG_MEM( testnum, nxreg, nfreg, correctval, code... ) \
323 vvcfgivl a3,a3,nxreg,nfreg; \
324 lui a0,%hi(vtcode ## testnum ); \
325 vf %lo(vtcode ## testnum )(a0); \
331 test_loop ## testnum: \
333 beq a0,a1,skip ## testnum; \
338 bne a2,a3,test_loop ## testnum; \
340 vtcode ## testnum : \
345 #define TEST_BR2_DIVERGED_MEM_FULL12( testnum, inst, n) \
346 TEST_CASE_NREG_MEM( testnum, 7, 0, 1, \
366 #define TEST_BR2_DIVERGED_MEM_FULL21( testnum, inst, n) \
367 TEST_CASE_NREG_MEM( testnum, 7, 0, 1, \
387 #-----------------------------------------------------------------------
388 # Tests floating-point instructions
389 #-----------------------------------------------------------------------
391 #define TEST_FP_OP_S_INTERNAL_NREG( testnum, nxreg, nfreg, result, val1, val2, val3, code... ) \
394 vvcfgivl a3,a3,nxreg,nfreg; \
395 la a5, test_ ## testnum ## _data ;\
396 vflstw vf0, a5, x0; \
398 vflstw vf1, a5, x0; \
400 vflstw vf2, a5, x0; \
402 lui a0,%hi(vtcode ## testnum ); \
403 vf %lo(vtcode ## testnum )(a0); \
410 test_loop ## testnum: \
412 beq a0,a1,skip ## testnum; \
417 bne a2,a3,test_loop ## testnum; \
419 vtcode ## testnum : \
423 test_ ## testnum ## _data: \
430 #define TEST_FP_OP_D_INTERNAL_NREG( testnum, nxreg, nfreg, result, val1, val2, val3, code... ) \
433 vvcfgivl a3,a3,nxreg,nfreg; \
434 la a5, test_ ## testnum ## _data ;\
435 vflstd vf0, a5, x0; \
437 vflstd vf1, a5, x0; \
439 vflstd vf2, a5, x0; \
441 lui a0,%hi(vtcode ## testnum ); \
442 vf %lo(vtcode ## testnum )(a0); \
449 test_loop ## testnum: \
451 beq a0,a1,skip ## testnum; \
456 bne a2,a3,test_loop ## testnum; \
458 vtcode ## testnum : \
462 test_ ## testnum ## _data: \
469 #define TEST_FCVT_S_D( testnum, result, val1 ) \
470 TEST_FP_OP_D_INTERNAL_NREG( testnum, 2, 4, double result, val1, 0.0, 0.0, \
471 fcvt.s.d f3, f0; fcvt.d.s f3, f3; mftx.d x1, f3)
473 #define TEST_FCVT_D_S( testnum, result, val1 ) \
474 TEST_FP_OP_S_INTERNAL_NREG( testnum, 2, 4, float result, val1, 0.0, 0.0, \
475 fcvt.d.s f3, f0; fcvt.s.d f3, f3; mftx.s x1, f3)
477 #define TEST_FP_OP2_S( testnum, inst, result, val1, val2 ) \
478 TEST_FP_OP_S_INTERNAL_NREG( testnum, 2, 4, float result, val1, val2, 0.0, \
479 inst f3, f0, f1; mftx.s x1, f3)
481 #define TEST_FP_OP2_D( testnum, inst, result, val1, val2 ) \
482 TEST_FP_OP_D_INTERNAL_NREG( testnum, 2, 4, double result, val1, val2, 0.0, \
483 inst f3, f0, f1; mftx.d x1, f3)
485 #define TEST_FP_OP3_S( testnum, inst, result, val1, val2, val3 ) \
486 TEST_FP_OP_S_INTERNAL_NREG( testnum, 2, 4, float result, val1, val2, val3, \
487 inst f3, f0, f1, f2; mftx.s x1, f3)
489 #define TEST_FP_OP3_D( testnum, inst, result, val1, val2, val3 ) \
490 TEST_FP_OP_D_INTERNAL_NREG( testnum, 2, 4, double result, val1, val2, val3, \
491 inst f3, f0, f1, f2; mftx.d x1, f3)
493 #define TEST_FP_INT_OP_S( testnum, inst, result, val1, rm ) \
494 TEST_FP_OP_S_INTERNAL_NREG( testnum, 2, 4, word result, val1, 0.0, 0.0, \
497 #define TEST_FP_INT_OP_D( testnum, inst, result, val1, rm ) \
498 TEST_FP_OP_D_INTERNAL_NREG( testnum, 2, 4, dword result, val1, 0.0, 0.0, \
501 #define TEST_FP_CMP_OP_S( testnum, inst, result, val1, val2 ) \
502 TEST_FP_OP_S_INTERNAL_NREG( testnum, 2, 4, word result, val1, val2, 0.0, \
505 #define TEST_FP_CMP_OP_D( testnum, inst, result, val1, val2 ) \
506 TEST_FP_OP_D_INTERNAL_NREG( testnum, 2, 4, dword result, val1, val2, 0.0, \
509 #define TEST_INT_FP_OP_S( testnum, inst, result, val1 ) \
512 vvcfgivl a3,a3,2,1; \
513 lui a0,%hi(vtcode ## testnum ); \
514 vf %lo(vtcode ## testnum )(a0); \
518 la a5, test_ ## testnum ## _data ;\
522 test_loop ## testnum: \
524 beq a0,a1,skip ## testnum; \
529 bne a2,a3,test_loop ## testnum; \
531 vtcode ## testnum : \
537 test_ ## testnum ## _data: \
541 #define TEST_INT_FP_OP_D( testnum, inst, result, val1 ) \
544 vvcfgivl a3,a3,2,1; \
545 lui a0,%hi(vtcode ## testnum ); \
546 vf %lo(vtcode ## testnum )(a0); \
550 la a5, test_ ## testnum ## _data ;\
554 test_loop ## testnum: \
556 beq a0,a1,skip ## testnum; \
561 bne a2,a3,test_loop ## testnum; \
563 vtcode ## testnum : \
569 test_ ## testnum ## _data: \
573 #-----------------------------------------------------------------------
574 # Pass and fail code (assumes test num is in x28)
575 #-----------------------------------------------------------------------
577 #define TEST_PASSFAIL \