112771Sqtt2@cornell.edu// See LICENSE for license details.
212771Sqtt2@cornell.edu
312771Sqtt2@cornell.edu#ifndef __TEST_MACROS_SCALAR_H
412771Sqtt2@cornell.edu#define __TEST_MACROS_SCALAR_H
512771Sqtt2@cornell.edu
612771Sqtt2@cornell.edu
712771Sqtt2@cornell.edu#-----------------------------------------------------------------------
812771Sqtt2@cornell.edu# Helper macros
912771Sqtt2@cornell.edu#-----------------------------------------------------------------------
1012771Sqtt2@cornell.edu
1112771Sqtt2@cornell.edu#define MASK_XLEN(x) ((x) & ((1 << (__riscv_xlen - 1) << 1) - 1))
1212771Sqtt2@cornell.edu
1312771Sqtt2@cornell.edu#define TEST_CASE( testnum, testreg, correctval, code... ) \
1412771Sqtt2@cornell.edutest_ ## testnum: \
1512771Sqtt2@cornell.edu    code; \
1612771Sqtt2@cornell.edu    li  x29, MASK_XLEN(correctval); \
1712771Sqtt2@cornell.edu    li  TESTNUM, testnum; \
1812771Sqtt2@cornell.edu    bne testreg, x29, fail;
1912771Sqtt2@cornell.edu
2012771Sqtt2@cornell.edu# We use a macro hack to simpify code generation for various numbers
2112771Sqtt2@cornell.edu# of bubble cycles.
2212771Sqtt2@cornell.edu
2312771Sqtt2@cornell.edu#define TEST_INSERT_NOPS_0
2412771Sqtt2@cornell.edu#define TEST_INSERT_NOPS_1  nop; TEST_INSERT_NOPS_0
2512771Sqtt2@cornell.edu#define TEST_INSERT_NOPS_2  nop; TEST_INSERT_NOPS_1
2612771Sqtt2@cornell.edu#define TEST_INSERT_NOPS_3  nop; TEST_INSERT_NOPS_2
2712771Sqtt2@cornell.edu#define TEST_INSERT_NOPS_4  nop; TEST_INSERT_NOPS_3
2812771Sqtt2@cornell.edu#define TEST_INSERT_NOPS_5  nop; TEST_INSERT_NOPS_4
2912771Sqtt2@cornell.edu#define TEST_INSERT_NOPS_6  nop; TEST_INSERT_NOPS_5
3012771Sqtt2@cornell.edu#define TEST_INSERT_NOPS_7  nop; TEST_INSERT_NOPS_6
3112771Sqtt2@cornell.edu#define TEST_INSERT_NOPS_8  nop; TEST_INSERT_NOPS_7
3212771Sqtt2@cornell.edu#define TEST_INSERT_NOPS_9  nop; TEST_INSERT_NOPS_8
3312771Sqtt2@cornell.edu#define TEST_INSERT_NOPS_10 nop; TEST_INSERT_NOPS_9
3412771Sqtt2@cornell.edu
3512771Sqtt2@cornell.edu
3612771Sqtt2@cornell.edu#-----------------------------------------------------------------------
3712771Sqtt2@cornell.edu# RV64UI MACROS
3812771Sqtt2@cornell.edu#-----------------------------------------------------------------------
3912771Sqtt2@cornell.edu
4012771Sqtt2@cornell.edu#-----------------------------------------------------------------------
4112771Sqtt2@cornell.edu# Tests for instructions with immediate operand
4212771Sqtt2@cornell.edu#-----------------------------------------------------------------------
4312771Sqtt2@cornell.edu
4412771Sqtt2@cornell.edu#define SEXT_IMM(x) ((x) | (-(((x) >> 11) & 1) << 11))
4512771Sqtt2@cornell.edu
4612771Sqtt2@cornell.edu#define TEST_IMM_OP( testnum, inst, result, val1, imm ) \
4712771Sqtt2@cornell.edu    TEST_CASE( testnum, x30, result, \
4812771Sqtt2@cornell.edu      li  x1, MASK_XLEN(val1); \
4912771Sqtt2@cornell.edu      inst x30, x1, SEXT_IMM(imm); \
5012771Sqtt2@cornell.edu    )
5112771Sqtt2@cornell.edu
5212771Sqtt2@cornell.edu#define TEST_IMM_SRC1_EQ_DEST( testnum, inst, result, val1, imm ) \
5312771Sqtt2@cornell.edu    TEST_CASE( testnum, x1, result, \
5412771Sqtt2@cornell.edu      li  x1, MASK_XLEN(val1); \
5512771Sqtt2@cornell.edu      inst x1, x1, SEXT_IMM(imm); \
5612771Sqtt2@cornell.edu    )
5712771Sqtt2@cornell.edu
5812771Sqtt2@cornell.edu#define TEST_IMM_DEST_BYPASS( testnum, nop_cycles, inst, result, val1, imm ) \
5912771Sqtt2@cornell.edu    TEST_CASE( testnum, x6, result, \
6012771Sqtt2@cornell.edu      li  x4, 0; \
6112771Sqtt2@cornell.edu1:    li  x1, MASK_XLEN(val1); \
6212771Sqtt2@cornell.edu      inst x30, x1, SEXT_IMM(imm); \
6312771Sqtt2@cornell.edu      TEST_INSERT_NOPS_ ## nop_cycles \
6412771Sqtt2@cornell.edu      addi  x6, x30, 0; \
6512771Sqtt2@cornell.edu      addi  x4, x4, 1; \
6612771Sqtt2@cornell.edu      li  x5, 2; \
6712771Sqtt2@cornell.edu      bne x4, x5, 1b \
6812771Sqtt2@cornell.edu    )
6912771Sqtt2@cornell.edu
7012771Sqtt2@cornell.edu#define TEST_IMM_SRC1_BYPASS( testnum, nop_cycles, inst, result, val1, imm ) \
7112771Sqtt2@cornell.edu    TEST_CASE( testnum, x30, result, \
7212771Sqtt2@cornell.edu      li  x4, 0; \
7312771Sqtt2@cornell.edu1:    li  x1, MASK_XLEN(val1); \
7412771Sqtt2@cornell.edu      TEST_INSERT_NOPS_ ## nop_cycles \
7512771Sqtt2@cornell.edu      inst x30, x1, SEXT_IMM(imm); \
7612771Sqtt2@cornell.edu      addi  x4, x4, 1; \
7712771Sqtt2@cornell.edu      li  x5, 2; \
7812771Sqtt2@cornell.edu      bne x4, x5, 1b \
7912771Sqtt2@cornell.edu    )
8012771Sqtt2@cornell.edu
8112771Sqtt2@cornell.edu#define TEST_IMM_ZEROSRC1( testnum, inst, result, imm ) \
8212771Sqtt2@cornell.edu    TEST_CASE( testnum, x1, result, \
8312771Sqtt2@cornell.edu      inst x1, x0, SEXT_IMM(imm); \
8412771Sqtt2@cornell.edu    )
8512771Sqtt2@cornell.edu
8612771Sqtt2@cornell.edu#define TEST_IMM_ZERODEST( testnum, inst, val1, imm ) \
8712771Sqtt2@cornell.edu    TEST_CASE( testnum, x0, 0, \
8812771Sqtt2@cornell.edu      li  x1, MASK_XLEN(val1); \
8912771Sqtt2@cornell.edu      inst x0, x1, SEXT_IMM(imm); \
9012771Sqtt2@cornell.edu    )
9112771Sqtt2@cornell.edu
9212771Sqtt2@cornell.edu#-----------------------------------------------------------------------
9312771Sqtt2@cornell.edu# Tests for an instruction with register operands
9412771Sqtt2@cornell.edu#-----------------------------------------------------------------------
9512771Sqtt2@cornell.edu
9612771Sqtt2@cornell.edu#define TEST_R_OP( testnum, inst, result, val1 ) \
9712771Sqtt2@cornell.edu    TEST_CASE( testnum, x30, result, \
9812771Sqtt2@cornell.edu      li  x1, val1; \
9912771Sqtt2@cornell.edu      inst x30, x1; \
10012771Sqtt2@cornell.edu    )
10112771Sqtt2@cornell.edu
10212771Sqtt2@cornell.edu#define TEST_R_SRC1_EQ_DEST( testnum, inst, result, val1 ) \
10312771Sqtt2@cornell.edu    TEST_CASE( testnum, x1, result, \
10412771Sqtt2@cornell.edu      li  x1, val1; \
10512771Sqtt2@cornell.edu      inst x1, x1; \
10612771Sqtt2@cornell.edu    )
10712771Sqtt2@cornell.edu
10812771Sqtt2@cornell.edu#define TEST_R_DEST_BYPASS( testnum, nop_cycles, inst, result, val1 ) \
10912771Sqtt2@cornell.edu    TEST_CASE( testnum, x6, result, \
11012771Sqtt2@cornell.edu      li  x4, 0; \
11112771Sqtt2@cornell.edu1:    li  x1, val1; \
11212771Sqtt2@cornell.edu      inst x30, x1; \
11312771Sqtt2@cornell.edu      TEST_INSERT_NOPS_ ## nop_cycles \
11412771Sqtt2@cornell.edu      addi  x6, x30, 0; \
11512771Sqtt2@cornell.edu      addi  x4, x4, 1; \
11612771Sqtt2@cornell.edu      li  x5, 2; \
11712771Sqtt2@cornell.edu      bne x4, x5, 1b \
11812771Sqtt2@cornell.edu    )
11912771Sqtt2@cornell.edu
12012771Sqtt2@cornell.edu#-----------------------------------------------------------------------
12112771Sqtt2@cornell.edu# Tests for an instruction with register-register operands
12212771Sqtt2@cornell.edu#-----------------------------------------------------------------------
12312771Sqtt2@cornell.edu
12412771Sqtt2@cornell.edu#define TEST_RR_OP( testnum, inst, result, val1, val2 ) \
12512771Sqtt2@cornell.edu    TEST_CASE( testnum, x30, result, \
12612771Sqtt2@cornell.edu      li  x1, MASK_XLEN(val1); \
12712771Sqtt2@cornell.edu      li  x2, MASK_XLEN(val2); \
12812771Sqtt2@cornell.edu      inst x30, x1, x2; \
12912771Sqtt2@cornell.edu    )
13012771Sqtt2@cornell.edu
13112771Sqtt2@cornell.edu#define TEST_RR_SRC1_EQ_DEST( testnum, inst, result, val1, val2 ) \
13212771Sqtt2@cornell.edu    TEST_CASE( testnum, x1, result, \
13312771Sqtt2@cornell.edu      li  x1, MASK_XLEN(val1); \
13412771Sqtt2@cornell.edu      li  x2, MASK_XLEN(val2); \
13512771Sqtt2@cornell.edu      inst x1, x1, x2; \
13612771Sqtt2@cornell.edu    )
13712771Sqtt2@cornell.edu
13812771Sqtt2@cornell.edu#define TEST_RR_SRC2_EQ_DEST( testnum, inst, result, val1, val2 ) \
13912771Sqtt2@cornell.edu    TEST_CASE( testnum, x2, result, \
14012771Sqtt2@cornell.edu      li  x1, MASK_XLEN(val1); \
14112771Sqtt2@cornell.edu      li  x2, MASK_XLEN(val2); \
14212771Sqtt2@cornell.edu      inst x2, x1, x2; \
14312771Sqtt2@cornell.edu    )
14412771Sqtt2@cornell.edu
14512771Sqtt2@cornell.edu#define TEST_RR_SRC12_EQ_DEST( testnum, inst, result, val1 ) \
14612771Sqtt2@cornell.edu    TEST_CASE( testnum, x1, result, \
14712771Sqtt2@cornell.edu      li  x1, MASK_XLEN(val1); \
14812771Sqtt2@cornell.edu      inst x1, x1, x1; \
14912771Sqtt2@cornell.edu    )
15012771Sqtt2@cornell.edu
15112771Sqtt2@cornell.edu#define TEST_RR_DEST_BYPASS( testnum, nop_cycles, inst, result, val1, val2 ) \
15212771Sqtt2@cornell.edu    TEST_CASE( testnum, x6, result, \
15312771Sqtt2@cornell.edu      li  x4, 0; \
15412771Sqtt2@cornell.edu1:    li  x1, MASK_XLEN(val1); \
15512771Sqtt2@cornell.edu      li  x2, MASK_XLEN(val2); \
15612771Sqtt2@cornell.edu      inst x30, x1, x2; \
15712771Sqtt2@cornell.edu      TEST_INSERT_NOPS_ ## nop_cycles \
15812771Sqtt2@cornell.edu      addi  x6, x30, 0; \
15912771Sqtt2@cornell.edu      addi  x4, x4, 1; \
16012771Sqtt2@cornell.edu      li  x5, 2; \
16112771Sqtt2@cornell.edu      bne x4, x5, 1b \
16212771Sqtt2@cornell.edu    )
16312771Sqtt2@cornell.edu
16412771Sqtt2@cornell.edu#define TEST_RR_SRC12_BYPASS( testnum, src1_nops, src2_nops, inst, result, val1, val2 ) \
16512771Sqtt2@cornell.edu    TEST_CASE( testnum, x30, result, \
16612771Sqtt2@cornell.edu      li  x4, 0; \
16712771Sqtt2@cornell.edu1:    li  x1, MASK_XLEN(val1); \
16812771Sqtt2@cornell.edu      TEST_INSERT_NOPS_ ## src1_nops \
16912771Sqtt2@cornell.edu      li  x2, MASK_XLEN(val2); \
17012771Sqtt2@cornell.edu      TEST_INSERT_NOPS_ ## src2_nops \
17112771Sqtt2@cornell.edu      inst x30, x1, x2; \
17212771Sqtt2@cornell.edu      addi  x4, x4, 1; \
17312771Sqtt2@cornell.edu      li  x5, 2; \
17412771Sqtt2@cornell.edu      bne x4, x5, 1b \
17512771Sqtt2@cornell.edu    )
17612771Sqtt2@cornell.edu
17712771Sqtt2@cornell.edu#define TEST_RR_SRC21_BYPASS( testnum, src1_nops, src2_nops, inst, result, val1, val2 ) \
17812771Sqtt2@cornell.edu    TEST_CASE( testnum, x30, result, \
17912771Sqtt2@cornell.edu      li  x4, 0; \
18012771Sqtt2@cornell.edu1:    li  x2, MASK_XLEN(val2); \
18112771Sqtt2@cornell.edu      TEST_INSERT_NOPS_ ## src1_nops \
18212771Sqtt2@cornell.edu      li  x1, MASK_XLEN(val1); \
18312771Sqtt2@cornell.edu      TEST_INSERT_NOPS_ ## src2_nops \
18412771Sqtt2@cornell.edu      inst x30, x1, x2; \
18512771Sqtt2@cornell.edu      addi  x4, x4, 1; \
18612771Sqtt2@cornell.edu      li  x5, 2; \
18712771Sqtt2@cornell.edu      bne x4, x5, 1b \
18812771Sqtt2@cornell.edu    )
18912771Sqtt2@cornell.edu
19012771Sqtt2@cornell.edu#define TEST_RR_ZEROSRC1( testnum, inst, result, val ) \
19112771Sqtt2@cornell.edu    TEST_CASE( testnum, x2, result, \
19212771Sqtt2@cornell.edu      li x1, MASK_XLEN(val); \
19312771Sqtt2@cornell.edu      inst x2, x0, x1; \
19412771Sqtt2@cornell.edu    )
19512771Sqtt2@cornell.edu
19612771Sqtt2@cornell.edu#define TEST_RR_ZEROSRC2( testnum, inst, result, val ) \
19712771Sqtt2@cornell.edu    TEST_CASE( testnum, x2, result, \
19812771Sqtt2@cornell.edu      li x1, MASK_XLEN(val); \
19912771Sqtt2@cornell.edu      inst x2, x1, x0; \
20012771Sqtt2@cornell.edu    )
20112771Sqtt2@cornell.edu
20212771Sqtt2@cornell.edu#define TEST_RR_ZEROSRC12( testnum, inst, result ) \
20312771Sqtt2@cornell.edu    TEST_CASE( testnum, x1, result, \
20412771Sqtt2@cornell.edu      inst x1, x0, x0; \
20512771Sqtt2@cornell.edu    )
20612771Sqtt2@cornell.edu
20712771Sqtt2@cornell.edu#define TEST_RR_ZERODEST( testnum, inst, val1, val2 ) \
20812771Sqtt2@cornell.edu    TEST_CASE( testnum, x0, 0, \
20912771Sqtt2@cornell.edu      li x1, MASK_XLEN(val1); \
21012771Sqtt2@cornell.edu      li x2, MASK_XLEN(val2); \
21112771Sqtt2@cornell.edu      inst x0, x1, x2; \
21212771Sqtt2@cornell.edu    )
21312771Sqtt2@cornell.edu
21412771Sqtt2@cornell.edu#-----------------------------------------------------------------------
21512771Sqtt2@cornell.edu# Test memory instructions
21612771Sqtt2@cornell.edu#-----------------------------------------------------------------------
21712771Sqtt2@cornell.edu
21812771Sqtt2@cornell.edu#define TEST_LD_OP( testnum, inst, result, offset, base ) \
21912771Sqtt2@cornell.edu    TEST_CASE( testnum, x30, result, \
22012771Sqtt2@cornell.edu      la  x1, base; \
22112771Sqtt2@cornell.edu      inst x30, offset(x1); \
22212771Sqtt2@cornell.edu    )
22312771Sqtt2@cornell.edu
22412771Sqtt2@cornell.edu#define TEST_ST_OP( testnum, load_inst, store_inst, result, offset, base ) \
22512771Sqtt2@cornell.edu    TEST_CASE( testnum, x30, result, \
22612771Sqtt2@cornell.edu      la  x1, base; \
22712771Sqtt2@cornell.edu      li  x2, result; \
22812771Sqtt2@cornell.edu      store_inst x2, offset(x1); \
22912771Sqtt2@cornell.edu      load_inst x30, offset(x1); \
23012771Sqtt2@cornell.edu    )
23112771Sqtt2@cornell.edu
23212771Sqtt2@cornell.edu#define TEST_LD_DEST_BYPASS( testnum, nop_cycles, inst, result, offset, base ) \
23312771Sqtt2@cornell.edutest_ ## testnum: \
23412771Sqtt2@cornell.edu    li  TESTNUM, testnum; \
23512771Sqtt2@cornell.edu    li  x4, 0; \
23612771Sqtt2@cornell.edu1:  la  x1, base; \
23712771Sqtt2@cornell.edu    inst x30, offset(x1); \
23812771Sqtt2@cornell.edu    TEST_INSERT_NOPS_ ## nop_cycles \
23912771Sqtt2@cornell.edu    addi  x6, x30, 0; \
24012771Sqtt2@cornell.edu    li  x29, result; \
24112771Sqtt2@cornell.edu    bne x6, x29, fail; \
24212771Sqtt2@cornell.edu    addi  x4, x4, 1; \
24312771Sqtt2@cornell.edu    li  x5, 2; \
24412771Sqtt2@cornell.edu    bne x4, x5, 1b; \
24512771Sqtt2@cornell.edu
24612771Sqtt2@cornell.edu#define TEST_LD_SRC1_BYPASS( testnum, nop_cycles, inst, result, offset, base ) \
24712771Sqtt2@cornell.edutest_ ## testnum: \
24812771Sqtt2@cornell.edu    li  TESTNUM, testnum; \
24912771Sqtt2@cornell.edu    li  x4, 0; \
25012771Sqtt2@cornell.edu1:  la  x1, base; \
25112771Sqtt2@cornell.edu    TEST_INSERT_NOPS_ ## nop_cycles \
25212771Sqtt2@cornell.edu    inst x30, offset(x1); \
25312771Sqtt2@cornell.edu    li  x29, result; \
25412771Sqtt2@cornell.edu    bne x30, x29, fail; \
25512771Sqtt2@cornell.edu    addi  x4, x4, 1; \
25612771Sqtt2@cornell.edu    li  x5, 2; \
25712771Sqtt2@cornell.edu    bne x4, x5, 1b \
25812771Sqtt2@cornell.edu
25912771Sqtt2@cornell.edu#define TEST_ST_SRC12_BYPASS( testnum, src1_nops, src2_nops, load_inst, store_inst, result, offset, base ) \
26012771Sqtt2@cornell.edutest_ ## testnum: \
26112771Sqtt2@cornell.edu    li  TESTNUM, testnum; \
26212771Sqtt2@cornell.edu    li  x4, 0; \
26312771Sqtt2@cornell.edu1:  li  x1, result; \
26412771Sqtt2@cornell.edu    TEST_INSERT_NOPS_ ## src1_nops \
26512771Sqtt2@cornell.edu    la  x2, base; \
26612771Sqtt2@cornell.edu    TEST_INSERT_NOPS_ ## src2_nops \
26712771Sqtt2@cornell.edu    store_inst x1, offset(x2); \
26812771Sqtt2@cornell.edu    load_inst x30, offset(x2); \
26912771Sqtt2@cornell.edu    li  x29, result; \
27012771Sqtt2@cornell.edu    bne x30, x29, fail; \
27112771Sqtt2@cornell.edu    addi  x4, x4, 1; \
27212771Sqtt2@cornell.edu    li  x5, 2; \
27312771Sqtt2@cornell.edu    bne x4, x5, 1b \
27412771Sqtt2@cornell.edu
27512771Sqtt2@cornell.edu#define TEST_ST_SRC21_BYPASS( testnum, src1_nops, src2_nops, load_inst, store_inst, result, offset, base ) \
27612771Sqtt2@cornell.edutest_ ## testnum: \
27712771Sqtt2@cornell.edu    li  TESTNUM, testnum; \
27812771Sqtt2@cornell.edu    li  x4, 0; \
27912771Sqtt2@cornell.edu1:  la  x2, base; \
28012771Sqtt2@cornell.edu    TEST_INSERT_NOPS_ ## src1_nops \
28112771Sqtt2@cornell.edu    li  x1, result; \
28212771Sqtt2@cornell.edu    TEST_INSERT_NOPS_ ## src2_nops \
28312771Sqtt2@cornell.edu    store_inst x1, offset(x2); \
28412771Sqtt2@cornell.edu    load_inst x30, offset(x2); \
28512771Sqtt2@cornell.edu    li  x29, result; \
28612771Sqtt2@cornell.edu    bne x30, x29, fail; \
28712771Sqtt2@cornell.edu    addi  x4, x4, 1; \
28812771Sqtt2@cornell.edu    li  x5, 2; \
28912771Sqtt2@cornell.edu    bne x4, x5, 1b \
29012771Sqtt2@cornell.edu
29112771Sqtt2@cornell.edu#define TEST_BR2_OP_TAKEN( testnum, inst, val1, val2 ) \
29212771Sqtt2@cornell.edutest_ ## testnum: \
29312771Sqtt2@cornell.edu    li  TESTNUM, testnum; \
29412771Sqtt2@cornell.edu    li  x1, val1; \
29512771Sqtt2@cornell.edu    li  x2, val2; \
29612771Sqtt2@cornell.edu    inst x1, x2, 2f; \
29712771Sqtt2@cornell.edu    bne x0, TESTNUM, fail; \
29812771Sqtt2@cornell.edu1:  bne x0, TESTNUM, 3f; \
29912771Sqtt2@cornell.edu2:  inst x1, x2, 1b; \
30012771Sqtt2@cornell.edu    bne x0, TESTNUM, fail; \
30112771Sqtt2@cornell.edu3:
30212771Sqtt2@cornell.edu
30312771Sqtt2@cornell.edu#define TEST_BR2_OP_NOTTAKEN( testnum, inst, val1, val2 ) \
30412771Sqtt2@cornell.edutest_ ## testnum: \
30512771Sqtt2@cornell.edu    li  TESTNUM, testnum; \
30612771Sqtt2@cornell.edu    li  x1, val1; \
30712771Sqtt2@cornell.edu    li  x2, val2; \
30812771Sqtt2@cornell.edu    inst x1, x2, 1f; \
30912771Sqtt2@cornell.edu    bne x0, TESTNUM, 2f; \
31012771Sqtt2@cornell.edu1:  bne x0, TESTNUM, fail; \
31112771Sqtt2@cornell.edu2:  inst x1, x2, 1b; \
31212771Sqtt2@cornell.edu3:
31312771Sqtt2@cornell.edu
31412771Sqtt2@cornell.edu#define TEST_BR2_SRC12_BYPASS( testnum, src1_nops, src2_nops, inst, val1, val2 ) \
31512771Sqtt2@cornell.edutest_ ## testnum: \
31612771Sqtt2@cornell.edu    li  TESTNUM, testnum; \
31712771Sqtt2@cornell.edu    li  x4, 0; \
31812771Sqtt2@cornell.edu1:  li  x1, val1; \
31912771Sqtt2@cornell.edu    TEST_INSERT_NOPS_ ## src1_nops \
32012771Sqtt2@cornell.edu    li  x2, val2; \
32112771Sqtt2@cornell.edu    TEST_INSERT_NOPS_ ## src2_nops \
32212771Sqtt2@cornell.edu    inst x1, x2, fail; \
32312771Sqtt2@cornell.edu    addi  x4, x4, 1; \
32412771Sqtt2@cornell.edu    li  x5, 2; \
32512771Sqtt2@cornell.edu    bne x4, x5, 1b \
32612771Sqtt2@cornell.edu
32712771Sqtt2@cornell.edu#define TEST_BR2_SRC21_BYPASS( testnum, src1_nops, src2_nops, inst, val1, val2 ) \
32812771Sqtt2@cornell.edutest_ ## testnum: \
32912771Sqtt2@cornell.edu    li  TESTNUM, testnum; \
33012771Sqtt2@cornell.edu    li  x4, 0; \
33112771Sqtt2@cornell.edu1:  li  x2, val2; \
33212771Sqtt2@cornell.edu    TEST_INSERT_NOPS_ ## src1_nops \
33312771Sqtt2@cornell.edu    li  x1, val1; \
33412771Sqtt2@cornell.edu    TEST_INSERT_NOPS_ ## src2_nops \
33512771Sqtt2@cornell.edu    inst x1, x2, fail; \
33612771Sqtt2@cornell.edu    addi  x4, x4, 1; \
33712771Sqtt2@cornell.edu    li  x5, 2; \
33812771Sqtt2@cornell.edu    bne x4, x5, 1b \
33912771Sqtt2@cornell.edu
34012771Sqtt2@cornell.edu#-----------------------------------------------------------------------
34112771Sqtt2@cornell.edu# Test jump instructions
34212771Sqtt2@cornell.edu#-----------------------------------------------------------------------
34312771Sqtt2@cornell.edu
34412771Sqtt2@cornell.edu#define TEST_JR_SRC1_BYPASS( testnum, nop_cycles, inst ) \
34512771Sqtt2@cornell.edutest_ ## testnum: \
34612771Sqtt2@cornell.edu    li  TESTNUM, testnum; \
34712771Sqtt2@cornell.edu    li  x4, 0; \
34812771Sqtt2@cornell.edu1:  la  x6, 2f; \
34912771Sqtt2@cornell.edu    TEST_INSERT_NOPS_ ## nop_cycles \
35012771Sqtt2@cornell.edu    inst x6; \
35112771Sqtt2@cornell.edu    bne x0, TESTNUM, fail; \
35212771Sqtt2@cornell.edu2:  addi  x4, x4, 1; \
35312771Sqtt2@cornell.edu    li  x5, 2; \
35412771Sqtt2@cornell.edu    bne x4, x5, 1b \
35512771Sqtt2@cornell.edu
35612771Sqtt2@cornell.edu#define TEST_JALR_SRC1_BYPASS( testnum, nop_cycles, inst ) \
35712771Sqtt2@cornell.edutest_ ## testnum: \
35812771Sqtt2@cornell.edu    li  TESTNUM, testnum; \
35912771Sqtt2@cornell.edu    li  x4, 0; \
36012771Sqtt2@cornell.edu1:  la  x6, 2f; \
36112771Sqtt2@cornell.edu    TEST_INSERT_NOPS_ ## nop_cycles \
36212771Sqtt2@cornell.edu    inst x19, x6, 0; \
36312771Sqtt2@cornell.edu    bne x0, TESTNUM, fail; \
36412771Sqtt2@cornell.edu2:  addi  x4, x4, 1; \
36512771Sqtt2@cornell.edu    li  x5, 2; \
36612771Sqtt2@cornell.edu    bne x4, x5, 1b \
36712771Sqtt2@cornell.edu
36812771Sqtt2@cornell.edu
36912771Sqtt2@cornell.edu#-----------------------------------------------------------------------
37012771Sqtt2@cornell.edu# RV64UF MACROS
37112771Sqtt2@cornell.edu#-----------------------------------------------------------------------
37212771Sqtt2@cornell.edu
37312771Sqtt2@cornell.edu#-----------------------------------------------------------------------
37412771Sqtt2@cornell.edu# Tests floating-point instructions
37512771Sqtt2@cornell.edu#-----------------------------------------------------------------------
37612771Sqtt2@cornell.edu
37712771Sqtt2@cornell.edu#define qNaNf 0f:7fc00000
37812771Sqtt2@cornell.edu#define sNaNf 0f:7f800001
37912771Sqtt2@cornell.edu#define qNaN 0d:7ff8000000000000
38012771Sqtt2@cornell.edu#define sNaN 0d:7ff0000000000001
38112771Sqtt2@cornell.edu
38212771Sqtt2@cornell.edu#define TEST_FP_OP_S_INTERNAL( testnum, flags, result, val1, val2, val3, code... ) \
38312771Sqtt2@cornell.edutest_ ## testnum: \
38412771Sqtt2@cornell.edu  li  TESTNUM, testnum; \
38512771Sqtt2@cornell.edu  la  a0, test_ ## testnum ## _data ;\
38612771Sqtt2@cornell.edu  flw f0, 0(a0); \
38712771Sqtt2@cornell.edu  flw f1, 4(a0); \
38812771Sqtt2@cornell.edu  flw f2, 8(a0); \
38912771Sqtt2@cornell.edu  lw  a3, 12(a0); \
39012771Sqtt2@cornell.edu  code; \
39112771Sqtt2@cornell.edu  fsflags a1, x0; \
39212771Sqtt2@cornell.edu  li a2, flags; \
39312771Sqtt2@cornell.edu  bne a0, a3, fail; \
39412771Sqtt2@cornell.edu  bne a1, a2, fail; \
39512771Sqtt2@cornell.edu  .pushsection .data; \
39612771Sqtt2@cornell.edu  .align 2; \
39712771Sqtt2@cornell.edu  test_ ## testnum ## _data: \
39812771Sqtt2@cornell.edu  .float val1; \
39912771Sqtt2@cornell.edu  .float val2; \
40012771Sqtt2@cornell.edu  .float val3; \
40112771Sqtt2@cornell.edu  .result; \
40212771Sqtt2@cornell.edu  .popsection
40312771Sqtt2@cornell.edu
40412771Sqtt2@cornell.edu#define TEST_FP_OP_D_INTERNAL( testnum, flags, result, val1, val2, val3, code... ) \
40512771Sqtt2@cornell.edutest_ ## testnum: \
40612771Sqtt2@cornell.edu  li  TESTNUM, testnum; \
40712771Sqtt2@cornell.edu  la  a0, test_ ## testnum ## _data ;\
40812771Sqtt2@cornell.edu  fld f0, 0(a0); \
40912771Sqtt2@cornell.edu  fld f1, 8(a0); \
41012771Sqtt2@cornell.edu  fld f2, 16(a0); \
41112771Sqtt2@cornell.edu  ld  a3, 24(a0); \
41212771Sqtt2@cornell.edu  code; \
41312771Sqtt2@cornell.edu  fsflags a1, x0; \
41412771Sqtt2@cornell.edu  li a2, flags; \
41512771Sqtt2@cornell.edu  bne a0, a3, fail; \
41612771Sqtt2@cornell.edu  bne a1, a2, fail; \
41712771Sqtt2@cornell.edu  .pushsection .data; \
41812771Sqtt2@cornell.edu  .align 3; \
41912771Sqtt2@cornell.edu  test_ ## testnum ## _data: \
42012771Sqtt2@cornell.edu  .double val1; \
42112771Sqtt2@cornell.edu  .double val2; \
42212771Sqtt2@cornell.edu  .double val3; \
42312771Sqtt2@cornell.edu  .result; \
42412771Sqtt2@cornell.edu  .popsection
42512771Sqtt2@cornell.edu
42612771Sqtt2@cornell.edu// TODO: assign a separate mem location for the comparison address?
42712771Sqtt2@cornell.edu#define TEST_FP_OP_D32_INTERNAL( testnum, flags, result, val1, val2, val3, code... ) \
42812771Sqtt2@cornell.edutest_ ## testnum: \
42912771Sqtt2@cornell.edu  li  TESTNUM, testnum; \
43012771Sqtt2@cornell.edu  la  a0, test_ ## testnum ## _data ;\
43112771Sqtt2@cornell.edu  fld f0, 0(a0); \
43212771Sqtt2@cornell.edu  fld f1, 8(a0); \
43312771Sqtt2@cornell.edu  fld f2, 16(a0); \
43412771Sqtt2@cornell.edu  lw  a3, 24(a0); \
43512771Sqtt2@cornell.edu  lw  t1, 28(a0); \
43612771Sqtt2@cornell.edu  code; \
43712771Sqtt2@cornell.edu  fsflags a1, x0; \
43812771Sqtt2@cornell.edu  li a2, flags; \
43912771Sqtt2@cornell.edu  bne a0, a3, fail; \
44012771Sqtt2@cornell.edu  bne t1, t2, fail; \
44112771Sqtt2@cornell.edu  bne a1, a2, fail; \
44212771Sqtt2@cornell.edu  .pushsection .data; \
44312771Sqtt2@cornell.edu  .align 3; \
44412771Sqtt2@cornell.edu  test_ ## testnum ## _data: \
44512771Sqtt2@cornell.edu  .double val1; \
44612771Sqtt2@cornell.edu  .double val2; \
44712771Sqtt2@cornell.edu  .double val3; \
44812771Sqtt2@cornell.edu  .result; \
44912771Sqtt2@cornell.edu  .popsection
45012771Sqtt2@cornell.edu
45112771Sqtt2@cornell.edu#define TEST_FCVT_S_D32( testnum, result, val1 ) \
45212771Sqtt2@cornell.edu  TEST_FP_OP_D32_INTERNAL( testnum, 0, double result, val1, 0.0, 0.0, \
45312771Sqtt2@cornell.edu                    fcvt.s.d f3, f0; fcvt.d.s f3, f3; fsd f3, 0(a0); lw t2, 4(a0); lw a0, 0(a0))
45412771Sqtt2@cornell.edu
45512771Sqtt2@cornell.edu#define TEST_FCVT_S_D( testnum, result, val1 ) \
45612771Sqtt2@cornell.edu  TEST_FP_OP_D_INTERNAL( testnum, 0, double result, val1, 0.0, 0.0, \
45712771Sqtt2@cornell.edu                    fcvt.s.d f3, f0; fcvt.d.s f3, f3; fmv.x.d a0, f3)
45812771Sqtt2@cornell.edu
45912771Sqtt2@cornell.edu#define TEST_FCVT_D_S( testnum, result, val1 ) \
46012771Sqtt2@cornell.edu  TEST_FP_OP_S_INTERNAL( testnum, 0, float result, val1, 0.0, 0.0, \
46112771Sqtt2@cornell.edu                    fcvt.d.s f3, f0; fcvt.s.d f3, f3; fmv.x.s a0, f3)
46212771Sqtt2@cornell.edu
46312771Sqtt2@cornell.edu#define TEST_FP_OP1_S( testnum, inst, flags, result, val1 ) \
46412771Sqtt2@cornell.edu  TEST_FP_OP_S_INTERNAL( testnum, flags, float result, val1, 0.0, 0.0, \
46512771Sqtt2@cornell.edu                    inst f3, f0; fmv.x.s a0, f3)
46612771Sqtt2@cornell.edu
46712771Sqtt2@cornell.edu#define TEST_FP_OP1_D32( testnum, inst, flags, result, val1 ) \
46812771Sqtt2@cornell.edu  TEST_FP_OP_D32_INTERNAL( testnum, flags, double result, val1, 0.0, 0.0, \
46912771Sqtt2@cornell.edu                    inst f3, f0; fsd f3, 0(a0); lw t2, 4(a0); lw a0, 0(a0))
47012771Sqtt2@cornell.edu// ^: store computation result in address from a0, load high-word into t2
47112771Sqtt2@cornell.edu
47212771Sqtt2@cornell.edu#define TEST_FP_OP1_D( testnum, inst, flags, result, val1 ) \
47312771Sqtt2@cornell.edu  TEST_FP_OP_D_INTERNAL( testnum, flags, double result, val1, 0.0, 0.0, \
47412771Sqtt2@cornell.edu                    inst f3, f0; fmv.x.d a0, f3)
47512771Sqtt2@cornell.edu
47612771Sqtt2@cornell.edu#define TEST_FP_OP1_S_DWORD_RESULT( testnum, inst, flags, result, val1 ) \
47712771Sqtt2@cornell.edu  TEST_FP_OP_S_INTERNAL( testnum, flags, dword result, val1, 0.0, 0.0, \
47812771Sqtt2@cornell.edu                    inst f3, f0; fmv.x.s a0, f3)
47912771Sqtt2@cornell.edu
48012771Sqtt2@cornell.edu#define TEST_FP_OP1_D32_DWORD_RESULT( testnum, inst, flags, result, val1 ) \
48112771Sqtt2@cornell.edu  TEST_FP_OP_D32_INTERNAL( testnum, flags, dword result, val1, 0.0, 0.0, \
48212771Sqtt2@cornell.edu                    inst f3, f0; fsd f3, 0(a0); lw t2, 4(a0); lw a0, 0(a0))
48312771Sqtt2@cornell.edu// ^: store computation result in address from a0, load high-word into t2
48412771Sqtt2@cornell.edu
48512771Sqtt2@cornell.edu#define TEST_FP_OP1_D_DWORD_RESULT( testnum, inst, flags, result, val1 ) \
48612771Sqtt2@cornell.edu  TEST_FP_OP_D_INTERNAL( testnum, flags, dword result, val1, 0.0, 0.0, \
48712771Sqtt2@cornell.edu                    inst f3, f0; fmv.x.d a0, f3)
48812771Sqtt2@cornell.edu
48912771Sqtt2@cornell.edu#define TEST_FP_OP2_S( testnum, inst, flags, result, val1, val2 ) \
49012771Sqtt2@cornell.edu  TEST_FP_OP_S_INTERNAL( testnum, flags, float result, val1, val2, 0.0, \
49112771Sqtt2@cornell.edu                    inst f3, f0, f1; fmv.x.s a0, f3)
49212771Sqtt2@cornell.edu
49312771Sqtt2@cornell.edu#define TEST_FP_OP2_D32( testnum, inst, flags, result, val1, val2 ) \
49412771Sqtt2@cornell.edu  TEST_FP_OP_D32_INTERNAL( testnum, flags, double result, val1, val2, 0.0, \
49512771Sqtt2@cornell.edu                    inst f3, f0, f1; fsd f3, 0(a0); lw t2, 4(a0); lw a0, 0(a0))
49612771Sqtt2@cornell.edu// ^: store computation result in address from a0, load high-word into t2
49712771Sqtt2@cornell.edu
49812771Sqtt2@cornell.edu#define TEST_FP_OP2_D( testnum, inst, flags, result, val1, val2 ) \
49912771Sqtt2@cornell.edu  TEST_FP_OP_D_INTERNAL( testnum, flags, double result, val1, val2, 0.0, \
50012771Sqtt2@cornell.edu                    inst f3, f0, f1; fmv.x.d a0, f3)
50112771Sqtt2@cornell.edu
50212771Sqtt2@cornell.edu#define TEST_FP_OP3_S( testnum, inst, flags, result, val1, val2, val3 ) \
50312771Sqtt2@cornell.edu  TEST_FP_OP_S_INTERNAL( testnum, flags, float result, val1, val2, val3, \
50412771Sqtt2@cornell.edu                    inst f3, f0, f1, f2; fmv.x.s a0, f3)
50512771Sqtt2@cornell.edu
50612771Sqtt2@cornell.edu#define TEST_FP_OP3_D32( testnum, inst, flags, result, val1, val2, val3 ) \
50712771Sqtt2@cornell.edu  TEST_FP_OP_D32_INTERNAL( testnum, flags, double result, val1, val2, val3, \
50812771Sqtt2@cornell.edu                    inst f3, f0, f1, f2; fsd f3, 0(a0); lw t2, 4(a0); lw a0, 0(a0))
50912771Sqtt2@cornell.edu// ^: store computation result in address from a0, load high-word into t2
51012771Sqtt2@cornell.edu
51112771Sqtt2@cornell.edu#define TEST_FP_OP3_D( testnum, inst, flags, result, val1, val2, val3 ) \
51212771Sqtt2@cornell.edu  TEST_FP_OP_D_INTERNAL( testnum, flags, double result, val1, val2, val3, \
51312771Sqtt2@cornell.edu                    inst f3, f0, f1, f2; fmv.x.d a0, f3)
51412771Sqtt2@cornell.edu
51512771Sqtt2@cornell.edu#define TEST_FP_INT_OP_S( testnum, inst, flags, result, val1, rm ) \
51612771Sqtt2@cornell.edu  TEST_FP_OP_S_INTERNAL( testnum, flags, word result, val1, 0.0, 0.0, \
51712771Sqtt2@cornell.edu                    inst a0, f0, rm)
51812771Sqtt2@cornell.edu
51912771Sqtt2@cornell.edu#define TEST_FP_INT_OP_D32( testnum, inst, flags, result, val1, rm ) \
52012771Sqtt2@cornell.edu  TEST_FP_OP_D32_INTERNAL( testnum, flags, dword result, val1, 0.0, 0.0, \
52112771Sqtt2@cornell.edu                    inst a0, f0, f1; li t2, 0)
52212771Sqtt2@cornell.edu
52312771Sqtt2@cornell.edu#define TEST_FP_INT_OP_D( testnum, inst, flags, result, val1, rm ) \
52412771Sqtt2@cornell.edu  TEST_FP_OP_D_INTERNAL( testnum, flags, dword result, val1, 0.0, 0.0, \
52512771Sqtt2@cornell.edu                    inst a0, f0, rm)
52612771Sqtt2@cornell.edu
52712771Sqtt2@cornell.edu#define TEST_FP_CMP_OP_S( testnum, inst, flags, result, val1, val2 ) \
52812771Sqtt2@cornell.edu  TEST_FP_OP_S_INTERNAL( testnum, flags, word result, val1, val2, 0.0, \
52912771Sqtt2@cornell.edu                    inst a0, f0, f1)
53012771Sqtt2@cornell.edu
53112771Sqtt2@cornell.edu#define TEST_FP_CMP_OP_D32( testnum, inst, flags, result, val1, val2 ) \
53212771Sqtt2@cornell.edu  TEST_FP_OP_D32_INTERNAL( testnum, flags, dword result, val1, val2, 0.0, \
53312771Sqtt2@cornell.edu                    inst a0, f0, f1; li t2, 0)
53412771Sqtt2@cornell.edu
53512771Sqtt2@cornell.edu#define TEST_FP_CMP_OP_D( testnum, inst, flags, result, val1, val2 ) \
53612771Sqtt2@cornell.edu  TEST_FP_OP_D_INTERNAL( testnum, flags, dword result, val1, val2, 0.0, \
53712771Sqtt2@cornell.edu                    inst a0, f0, f1)
53812771Sqtt2@cornell.edu
53912771Sqtt2@cornell.edu#define TEST_FCLASS_S(testnum, correct, input) \
54012771Sqtt2@cornell.edu  TEST_CASE(testnum, a0, correct, li a0, input; fmv.s.x fa0, a0; \
54112771Sqtt2@cornell.edu                    fclass.s a0, fa0)
54212771Sqtt2@cornell.edu
54312771Sqtt2@cornell.edu#define TEST_FCLASS_D32(testnum, correct, input) \
54412771Sqtt2@cornell.edu  TEST_CASE(testnum, a0, correct, \
54512771Sqtt2@cornell.edu            la a0, test_ ## testnum ## _data ;\
54612771Sqtt2@cornell.edu            fld fa0, 0(a0); \
54712771Sqtt2@cornell.edu            fclass.d a0, fa0) \
54812771Sqtt2@cornell.edu    .pushsection .data; \
54912771Sqtt2@cornell.edu    .align 3; \
55012771Sqtt2@cornell.edu    test_ ## testnum ## _data: \
55112771Sqtt2@cornell.edu    .dword input; \
55212771Sqtt2@cornell.edu    .popsection
55312771Sqtt2@cornell.edu
55412771Sqtt2@cornell.edu#define TEST_FCLASS_D(testnum, correct, input) \
55512771Sqtt2@cornell.edu  TEST_CASE(testnum, a0, correct, li a0, input; fmv.d.x fa0, a0; \
55612771Sqtt2@cornell.edu                    fclass.d a0, fa0)
55712771Sqtt2@cornell.edu
55812771Sqtt2@cornell.edu#define TEST_INT_FP_OP_S( testnum, inst, result, val1 ) \
55912771Sqtt2@cornell.edutest_ ## testnum: \
56012771Sqtt2@cornell.edu  li  TESTNUM, testnum; \
56112771Sqtt2@cornell.edu  la  a0, test_ ## testnum ## _data ;\
56212771Sqtt2@cornell.edu  lw  a3, 0(a0); \
56312771Sqtt2@cornell.edu  li  a0, val1; \
56412771Sqtt2@cornell.edu  inst f0, a0; \
56512771Sqtt2@cornell.edu  fsflags x0; \
56612771Sqtt2@cornell.edu  fmv.x.s a0, f0; \
56712771Sqtt2@cornell.edu  bne a0, a3, fail; \
56812771Sqtt2@cornell.edu  .pushsection .data; \
56912771Sqtt2@cornell.edu  .align 2; \
57012771Sqtt2@cornell.edu  test_ ## testnum ## _data: \
57112771Sqtt2@cornell.edu  .float result; \
57212771Sqtt2@cornell.edu  .popsection
57312771Sqtt2@cornell.edu
57412771Sqtt2@cornell.edu#define TEST_INT_FP_OP_D32( testnum, inst, result, val1 ) \
57512771Sqtt2@cornell.edutest_ ## testnum: \
57612771Sqtt2@cornell.edu  li  TESTNUM, testnum; \
57712771Sqtt2@cornell.edu  la  a0, test_ ## testnum ## _data ;\
57812771Sqtt2@cornell.edu  lw  a3, 0(a0); \
57912771Sqtt2@cornell.edu  lw  a4, 4(a0); \
58012771Sqtt2@cornell.edu  li  a1, val1; \
58112771Sqtt2@cornell.edu  inst f0, a1; \
58212771Sqtt2@cornell.edu  \
58312771Sqtt2@cornell.edu  fsd f0, 0(a0); \
58412771Sqtt2@cornell.edu  lw a1, 4(a0); \
58512771Sqtt2@cornell.edu  lw a0, 0(a0); \
58612771Sqtt2@cornell.edu  \
58712771Sqtt2@cornell.edu  fsflags x0; \
58812771Sqtt2@cornell.edu  bne a0, a3, fail; \
58912771Sqtt2@cornell.edu  bne a1, a4, fail; \
59012771Sqtt2@cornell.edu  .pushsection .data; \
59112771Sqtt2@cornell.edu  .align 3; \
59212771Sqtt2@cornell.edu  test_ ## testnum ## _data: \
59312771Sqtt2@cornell.edu  .double result; \
59412771Sqtt2@cornell.edu  .popsection
59512771Sqtt2@cornell.edu
59612771Sqtt2@cornell.edu#define TEST_INT_FP_OP_D( testnum, inst, result, val1 ) \
59712771Sqtt2@cornell.edutest_ ## testnum: \
59812771Sqtt2@cornell.edu  li  TESTNUM, testnum; \
59912771Sqtt2@cornell.edu  la  a0, test_ ## testnum ## _data ;\
60012771Sqtt2@cornell.edu  ld  a3, 0(a0); \
60112771Sqtt2@cornell.edu  li  a0, val1; \
60212771Sqtt2@cornell.edu  inst f0, a0; \
60312771Sqtt2@cornell.edu  fsflags x0; \
60412771Sqtt2@cornell.edu  fmv.x.d a0, f0; \
60512771Sqtt2@cornell.edu  bne a0, a3, fail; \
60612771Sqtt2@cornell.edu  .pushsection .data; \
60712771Sqtt2@cornell.edu  .align 3; \
60812771Sqtt2@cornell.edu  test_ ## testnum ## _data: \
60912771Sqtt2@cornell.edu  .double result; \
61012771Sqtt2@cornell.edu  .popsection
61112771Sqtt2@cornell.edu
61212771Sqtt2@cornell.edu// We need some special handling here to allow 64-bit comparison in 32-bit arch
61312771Sqtt2@cornell.edu// TODO: find a better name and clean up when intended for general usage?
61412771Sqtt2@cornell.edu#define TEST_CASE_D32( testnum, testreg1, testreg2, correctval, code... ) \
61512771Sqtt2@cornell.edutest_ ## testnum: \
61612771Sqtt2@cornell.edu    code; \
61712771Sqtt2@cornell.edu    la  x31, test_ ## testnum ## _data ; \
61812771Sqtt2@cornell.edu    lw  x29, 0(x31); \
61912771Sqtt2@cornell.edu    lw  x31, 4(x31); \
62012771Sqtt2@cornell.edu    li  TESTNUM, testnum; \
62112771Sqtt2@cornell.edu    bne testreg1, x29, fail;\
62212771Sqtt2@cornell.edu    bne testreg2, x31, fail;\
62312771Sqtt2@cornell.edu    .pushsection .data; \
62412771Sqtt2@cornell.edu    .align 3; \
62512771Sqtt2@cornell.edu    test_ ## testnum ## _data: \
62612771Sqtt2@cornell.edu    .dword correctval; \
62712771Sqtt2@cornell.edu    .popsection
62812771Sqtt2@cornell.edu
62912771Sqtt2@cornell.edu// ^ x30 is used in some other macros, to avoid issues we use x31 for upper word
63012771Sqtt2@cornell.edu
63112771Sqtt2@cornell.edu#-----------------------------------------------------------------------
63212771Sqtt2@cornell.edu# Pass and fail code (assumes test num is in TESTNUM)
63312771Sqtt2@cornell.edu#-----------------------------------------------------------------------
63412771Sqtt2@cornell.edu
63512771Sqtt2@cornell.edu#define TEST_PASSFAIL \
63612771Sqtt2@cornell.edu        bne x0, TESTNUM, pass; \
63712771Sqtt2@cornell.edufail: \
63812771Sqtt2@cornell.edu        RVTEST_FAIL; \
63912771Sqtt2@cornell.edupass: \
64012771Sqtt2@cornell.edu        RVTEST_PASS \
64112771Sqtt2@cornell.edu
64212771Sqtt2@cornell.edu
64312771Sqtt2@cornell.edu#-----------------------------------------------------------------------
64412771Sqtt2@cornell.edu# Test data section
64512771Sqtt2@cornell.edu#-----------------------------------------------------------------------
64612771Sqtt2@cornell.edu
64712771Sqtt2@cornell.edu#define TEST_DATA
64812771Sqtt2@cornell.edu
64912771Sqtt2@cornell.edu#endif
650