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