|
| 1 | +# See LICENSE for license details. |
| 2 | + |
| 3 | +#***************************************************************************** |
| 4 | +# ld_st.S |
| 5 | +#----------------------------------------------------------------------------- |
| 6 | +# |
| 7 | +# Test load and store instructions |
| 8 | +# |
| 9 | + |
| 10 | +#include "riscv_test.h" |
| 11 | +#include "test_macros.h" |
| 12 | + |
| 13 | +RVTEST_RV64U |
| 14 | +RVTEST_CODE_BEGIN |
| 15 | + |
| 16 | + #------------------------------------------------------------- |
| 17 | + # Bypassing Tests |
| 18 | + #------------------------------------------------------------- |
| 19 | + |
| 20 | + # Test sb and lb (signed byte) |
| 21 | + TEST_LD_ST_BYPASS(2, lb, sb, 0xffffffffffffffdd, 0, tdat ); |
| 22 | + TEST_LD_ST_BYPASS(3, lb, sb, 0xffffffffffffffcd, 1, tdat ); |
| 23 | + TEST_LD_ST_BYPASS(4, lb, sb, 0xffffffffffffffcc, 2, tdat ); |
| 24 | + TEST_LD_ST_BYPASS(5, lb, sb, 0xffffffffffffffbc, 3, tdat ); |
| 25 | + TEST_LD_ST_BYPASS(6, lb, sb, 0xffffffffffffffbb, 4, tdat ); |
| 26 | + TEST_LD_ST_BYPASS(7, lb, sb, 0xffffffffffffffab, 5, tdat ); |
| 27 | + |
| 28 | + TEST_LD_ST_BYPASS(8, lb, sb, 0x33, 0, tdat ); |
| 29 | + TEST_LD_ST_BYPASS(9, lb, sb, 0x23, 1, tdat ); |
| 30 | + TEST_LD_ST_BYPASS(10, lb, sb, 0x22, 2, tdat ); |
| 31 | + TEST_LD_ST_BYPASS(11, lb, sb, 0x12, 3, tdat ); |
| 32 | + TEST_LD_ST_BYPASS(12, lb, sb, 0x11, 4, tdat ); |
| 33 | + TEST_LD_ST_BYPASS(13, lb, sb, 0x01, 5, tdat ); |
| 34 | + |
| 35 | + # Test sb and lbu (unsigned byte) |
| 36 | + TEST_LD_ST_BYPASS(14, lbu, sb, 0x33, 0, tdat ); |
| 37 | + TEST_LD_ST_BYPASS(15, lbu, sb, 0x23, 1, tdat ); |
| 38 | + TEST_LD_ST_BYPASS(16, lbu, sb, 0x22, 2, tdat ); |
| 39 | + TEST_LD_ST_BYPASS(17, lbu, sb, 0x12, 3, tdat ); |
| 40 | + TEST_LD_ST_BYPASS(18, lbu, sb, 0x11, 4, tdat ); |
| 41 | + TEST_LD_ST_BYPASS(19, lbu, sb, 0x01, 5, tdat ); |
| 42 | + |
| 43 | + # Test sw and lw (signed word) |
| 44 | + TEST_LD_ST_BYPASS(20, lw, sw, 0xffffffffaabbccdd, 0, tdat ); |
| 45 | + TEST_LD_ST_BYPASS(21, lw, sw, 0xffffffffdaabbccd, 4, tdat ); |
| 46 | + TEST_LD_ST_BYPASS(22, lw, sw, 0xffffffffddaabbcc, 8, tdat ); |
| 47 | + TEST_LD_ST_BYPASS(23, lw, sw, 0xffffffffcddaabbc, 12, tdat ); |
| 48 | + TEST_LD_ST_BYPASS(24, lw, sw, 0xffffffffccddaabb, 16, tdat ); |
| 49 | + TEST_LD_ST_BYPASS(25, lw, sw, 0xffffffffbccddaab, 20, tdat ); |
| 50 | + |
| 51 | + TEST_LD_ST_BYPASS(26, lw, sw, 0x00112233, 0, tdat ); |
| 52 | + TEST_LD_ST_BYPASS(27, lw, sw, 0x30011223, 4, tdat ); |
| 53 | + TEST_LD_ST_BYPASS(28, lw, sw, 0x33001122, 8, tdat ); |
| 54 | + TEST_LD_ST_BYPASS(29, lw, sw, 0x23300112, 12, tdat ); |
| 55 | + TEST_LD_ST_BYPASS(30, lw, sw, 0x22330011, 16, tdat ); |
| 56 | + TEST_LD_ST_BYPASS(31, lw, sw, 0x12233001, 20, tdat ); |
| 57 | + |
| 58 | + # Test sh and lh (signed halfword) |
| 59 | + TEST_LD_ST_BYPASS(32, lh, sh, 0xffffffffffffccdd, 0, tdat ); |
| 60 | + TEST_LD_ST_BYPASS(33, lh, sh, 0xffffffffffffbccd, 2, tdat ); |
| 61 | + TEST_LD_ST_BYPASS(34, lh, sh, 0xffffffffffffbbcc, 4, tdat ); |
| 62 | + TEST_LD_ST_BYPASS(35, lh, sh, 0xffffffffffffabbc, 6, tdat ); |
| 63 | + TEST_LD_ST_BYPASS(36, lh, sh, 0xffffffffffffaabb, 8, tdat ); |
| 64 | + TEST_LD_ST_BYPASS(37, lh, sh, 0xffffffffffffdaab, 10, tdat ); |
| 65 | + |
| 66 | + TEST_LD_ST_BYPASS(38, lh, sh, 0x2233, 0, tdat ); |
| 67 | + TEST_LD_ST_BYPASS(39, lh, sh, 0x1223, 2, tdat ); |
| 68 | + TEST_LD_ST_BYPASS(40, lh, sh, 0x1122, 4, tdat ); |
| 69 | + TEST_LD_ST_BYPASS(41, lh, sh, 0x0112, 6, tdat ); |
| 70 | + TEST_LD_ST_BYPASS(42, lh, sh, 0x0011, 8, tdat ); |
| 71 | + TEST_LD_ST_BYPASS(43, lh, sh, 0x3001, 10, tdat ); |
| 72 | + |
| 73 | + # Test sh and lhu (unsigned halfword) |
| 74 | + TEST_LD_ST_BYPASS(44, lhu, sh, 0x2233, 0, tdat ); |
| 75 | + TEST_LD_ST_BYPASS(45, lhu, sh, 0x1223, 2, tdat ); |
| 76 | + TEST_LD_ST_BYPASS(46, lhu, sh, 0x1122, 4, tdat ); |
| 77 | + TEST_LD_ST_BYPASS(47, lhu, sh, 0x0112, 6, tdat ); |
| 78 | + TEST_LD_ST_BYPASS(48, lhu, sh, 0x0011, 8, tdat ); |
| 79 | + TEST_LD_ST_BYPASS(49, lhu, sh, 0x3001, 10, tdat ); |
| 80 | + |
| 81 | + # RV64-specific tests for ld, sd, and lwu |
| 82 | +#if __riscv_xlen == 64 |
| 83 | + # Test sd and ld (doubleword) |
| 84 | + TEST_LD_ST_BYPASS(50, ld, sd, 0x0011223344556677, 0, tdat ); |
| 85 | + TEST_LD_ST_BYPASS(51, ld, sd, 0x1122334455667788, 8, tdat ); |
| 86 | + TEST_LD_ST_BYPASS(52, ld, sd, 0x2233445566778899, 16, tdat ); |
| 87 | + TEST_LD_ST_BYPASS(53, ld, sd, 0xabbccdd, 0, tdat ); |
| 88 | + TEST_LD_ST_BYPASS(54, ld, sd, 0xaabbccd, 8, tdat ); |
| 89 | + TEST_LD_ST_BYPASS(55, ld, sd, 0xdaabbcc, 16, tdat ); |
| 90 | + TEST_LD_ST_BYPASS(56, ld, sd, 0xddaabbc, 24, tdat ); |
| 91 | + TEST_LD_ST_BYPASS(57, ld, sd, 0xcddaabb, 32, tdat ); |
| 92 | + TEST_LD_ST_BYPASS(58, ld, sd, 0xccddaab, 40, tdat ); |
| 93 | + |
| 94 | + TEST_LD_ST_BYPASS(59, ld, sd, 0x00112233, 0, tdat ); |
| 95 | + TEST_LD_ST_BYPASS(60, ld, sd, 0x30011223, 8, tdat ); |
| 96 | + TEST_LD_ST_BYPASS(61, ld, sd, 0x33001122, 16, tdat ); |
| 97 | + TEST_LD_ST_BYPASS(62, ld, sd, 0x23300112, 24, tdat ); |
| 98 | + TEST_LD_ST_BYPASS(63, ld, sd, 0x22330011, 32, tdat ); |
| 99 | + TEST_LD_ST_BYPASS(64, ld, sd, 0x12233001, 40, tdat ); |
| 100 | + |
| 101 | + # Test sw and lwu (unsigned word) |
| 102 | + TEST_LD_ST_BYPASS(65, lwu, sw, 0x00112233, 0, tdat ); |
| 103 | + TEST_LD_ST_BYPASS(66, lwu, sw, 0x33001122, 8, tdat ); |
| 104 | + TEST_LD_ST_BYPASS(67, lwu, sw, 0x30011223, 4, tdat ); |
| 105 | + TEST_LD_ST_BYPASS(68, lwu, sw, 0x23300112, 12, tdat ); |
| 106 | + TEST_LD_ST_BYPASS(69, lwu, sw, 0x22330011, 16, tdat ); |
| 107 | + TEST_LD_ST_BYPASS(70, lwu, sw, 0x12233001, 20, tdat ); |
| 108 | +#endif |
| 109 | + |
| 110 | + li a0, 0xef # Immediate load for manual store test |
| 111 | + la a1, tdat # Load address of tdat |
| 112 | + sb a0, 3(a1) # Store byte at offset 3 of tdat |
| 113 | + lb a2, 3(a1) # Load byte back for verification |
| 114 | + |
| 115 | + TEST_PASSFAIL |
| 116 | + |
| 117 | +RVTEST_CODE_END |
| 118 | + |
| 119 | + .data |
| 120 | +RVTEST_DATA_BEGIN |
| 121 | + |
| 122 | + TEST_DATA |
| 123 | + |
| 124 | +tdat: |
| 125 | + .rept 20 |
| 126 | + .word 0xdeadbeef |
| 127 | + .endr |
| 128 | + |
| 129 | + |
| 130 | +RVTEST_DATA_END |
0 commit comments