112771Sqtt2@cornell.edu# See LICENSE for license details.
212771Sqtt2@cornell.edu
312771Sqtt2@cornell.edu#*****************************************************************************
412771Sqtt2@cornell.edu# rvc.S
512771Sqtt2@cornell.edu#-----------------------------------------------------------------------------
612771Sqtt2@cornell.edu#
712771Sqtt2@cornell.edu# Test RVC corner cases.
812771Sqtt2@cornell.edu#
912771Sqtt2@cornell.edu
1012771Sqtt2@cornell.edu#include "riscv_test.h"
1112771Sqtt2@cornell.edu#include "test_macros.h"
1212771Sqtt2@cornell.edu
1312771Sqtt2@cornell.eduRVTEST_RV64U
1412771Sqtt2@cornell.eduRVTEST_CODE_BEGIN
1512771Sqtt2@cornell.edu
1612771Sqtt2@cornell.edu  .align 2
1712771Sqtt2@cornell.edu  .option push
1812771Sqtt2@cornell.edu  .option norvc
1912771Sqtt2@cornell.edu
2012771Sqtt2@cornell.edu  #define RVC_TEST_CASE(n, r, v, code...) \
2112771Sqtt2@cornell.edu    TEST_CASE (n, r, v, .option push; .option rvc; code; .align 2; .option pop)
2212771Sqtt2@cornell.edu
2312771Sqtt2@cornell.edu  // Make sure fetching a 4-byte instruction across a page boundary works.
2412771Sqtt2@cornell.edu  li TESTNUM, 2
2512771Sqtt2@cornell.edu  li a1, 666
2612771Sqtt2@cornell.edu  TEST_CASE (2, a1, 667, \
2712771Sqtt2@cornell.edu        j 1f; \
2812771Sqtt2@cornell.edu        .align 3; \
2912771Sqtt2@cornell.edu        data: \
3012771Sqtt2@cornell.edu          .dword 0xfedcba9876543210; \
3112771Sqtt2@cornell.edu          .dword 0xfedcba9876543210; \
3212771Sqtt2@cornell.edu        .align 12; \
3312771Sqtt2@cornell.edu        .skip 4094; \
3412771Sqtt2@cornell.edu      1: addi a1, a1, 1)
3512771Sqtt2@cornell.edu
3612771Sqtt2@cornell.edu  li sp, 0x1234
3712771Sqtt2@cornell.edu  RVC_TEST_CASE (3, a0, 0x1234 + 1020, c.addi4spn a0, sp, 1020)
3812771Sqtt2@cornell.edu  RVC_TEST_CASE (4, sp, 0x1234 + 496, c.addi16sp sp, 496)
3912771Sqtt2@cornell.edu  RVC_TEST_CASE (5, sp, 0x1234 + 496 - 512, c.addi16sp sp, -512)
4012771Sqtt2@cornell.edu
4112771Sqtt2@cornell.edu  la a1, data
4212771Sqtt2@cornell.edu  RVC_TEST_CASE (6, a2, 0xfffffffffedcba99, c.lw a0, 4(a1); addi a0, a0, 1; c.sw a0, 4(a1); c.lw a2, 4(a1))
4312771Sqtt2@cornell.edu#if __riscv_xlen == 64
4412771Sqtt2@cornell.edu  RVC_TEST_CASE (7, a2, 0xfedcba9976543211, c.ld a0, 0(a1); addi a0, a0, 1; c.sd a0, 0(a1); c.ld a2, 0(a1))
4512771Sqtt2@cornell.edu#endif
4612771Sqtt2@cornell.edu
4712771Sqtt2@cornell.edu  RVC_TEST_CASE (8, a0, -15, ori a0, x0, 1; c.addi a0, -16)
4812771Sqtt2@cornell.edu  RVC_TEST_CASE (9, a5, -16, ori a5, x0, 1; c.li a5, -16)
4912771Sqtt2@cornell.edu#if __riscv_xlen == 64
5012771Sqtt2@cornell.edu  RVC_TEST_CASE (10, a0, 0x76543210, ld a0, (a1); c.addiw a0, -1)
5112771Sqtt2@cornell.edu#endif
5212771Sqtt2@cornell.edu
5312771Sqtt2@cornell.edu  RVC_TEST_CASE (11, s0, 0xffffffffffffffe1, c.lui s0, 0xfffe1; c.srai s0, 12)
5412771Sqtt2@cornell.edu#if __riscv_xlen == 64
5512771Sqtt2@cornell.edu  RVC_TEST_CASE (12, s0, 0x000fffffffffffe1, c.lui s0, 0xfffe1; c.srli s0, 12)
5612771Sqtt2@cornell.edu#else
5712771Sqtt2@cornell.edu  RVC_TEST_CASE (12, s0, 0x000fffe1, c.lui s0, 0xfffe1; c.srli s0, 12)
5812771Sqtt2@cornell.edu#endif
5912771Sqtt2@cornell.edu  RVC_TEST_CASE (14, s0, ~0x11, c.li s0, -2; c.andi s0, ~0x10)
6012771Sqtt2@cornell.edu  RVC_TEST_CASE (15, s1, 14, li s1, 20; li a0, 6; c.sub s1, a0)
6112771Sqtt2@cornell.edu  RVC_TEST_CASE (16, s1, 18, li s1, 20; li a0, 6; c.xor s1, a0)
6212771Sqtt2@cornell.edu  RVC_TEST_CASE (17, s1, 22, li s1, 20; li a0, 6; c.or s1, a0)
6312771Sqtt2@cornell.edu  RVC_TEST_CASE (18, s1,  4, li s1, 20; li a0, 6; c.and s1, a0)
6412771Sqtt2@cornell.edu#if __riscv_xlen == 64
6512771Sqtt2@cornell.edu  RVC_TEST_CASE (19, s1, 0xffffffff80000000, li s1, 0x7fffffff; li a0, -1; c.subw s1, a0)
6612771Sqtt2@cornell.edu  RVC_TEST_CASE (20, s1, 0xffffffff80000000, li s1, 0x7fffffff; li a0, 1; c.addw s1, a0)
6712771Sqtt2@cornell.edu#endif
6812771Sqtt2@cornell.edu  RVC_TEST_CASE (21, s0, 0x12340, li s0, 0x1234; c.slli s0, 4)
6912771Sqtt2@cornell.edu
7012771Sqtt2@cornell.edu  RVC_TEST_CASE (30, ra, 0, \
7112771Sqtt2@cornell.edu        li ra, 0; \
7212771Sqtt2@cornell.edu        c.j 1f; \
7312771Sqtt2@cornell.edu        c.j 2f; \
7412771Sqtt2@cornell.edu      1:c.j 1f; \
7512771Sqtt2@cornell.edu      2:j fail; \
7612771Sqtt2@cornell.edu      1:)
7712771Sqtt2@cornell.edu
7812771Sqtt2@cornell.edu  RVC_TEST_CASE (31, x0, 0, \
7912771Sqtt2@cornell.edu        li a0, 0; \
8012771Sqtt2@cornell.edu        c.beqz a0, 1f; \
8112771Sqtt2@cornell.edu        c.j 2f; \
8212771Sqtt2@cornell.edu      1:c.j 1f; \
8312771Sqtt2@cornell.edu      2:j fail; \
8412771Sqtt2@cornell.edu      1:)
8512771Sqtt2@cornell.edu
8612771Sqtt2@cornell.edu  RVC_TEST_CASE (32, x0, 0, \
8712771Sqtt2@cornell.edu        li a0, 1; \
8812771Sqtt2@cornell.edu        c.bnez a0, 1f; \
8912771Sqtt2@cornell.edu        c.j 2f; \
9012771Sqtt2@cornell.edu      1:c.j 1f; \
9112771Sqtt2@cornell.edu      2:j fail; \
9212771Sqtt2@cornell.edu      1:)
9312771Sqtt2@cornell.edu
9412771Sqtt2@cornell.edu  RVC_TEST_CASE (33, x0, 0, \
9512771Sqtt2@cornell.edu        li a0, 1; \
9612771Sqtt2@cornell.edu        c.beqz a0, 1f; \
9712771Sqtt2@cornell.edu        c.j 2f; \
9812771Sqtt2@cornell.edu      1:c.j fail; \
9912771Sqtt2@cornell.edu      2:)
10012771Sqtt2@cornell.edu
10112771Sqtt2@cornell.edu  RVC_TEST_CASE (34, x0, 0, \
10212771Sqtt2@cornell.edu        li a0, 0; \
10312771Sqtt2@cornell.edu        c.bnez a0, 1f; \
10412771Sqtt2@cornell.edu        c.j 2f; \
10512771Sqtt2@cornell.edu      1:c.j fail; \
10612771Sqtt2@cornell.edu      2:)
10712771Sqtt2@cornell.edu
10812771Sqtt2@cornell.edu  RVC_TEST_CASE (35, ra, 0, \
10912771Sqtt2@cornell.edu        la t0, 1f; \
11012771Sqtt2@cornell.edu        li ra, 0; \
11112771Sqtt2@cornell.edu        c.jr t0; \
11212771Sqtt2@cornell.edu        c.j 2f; \
11312771Sqtt2@cornell.edu      1:c.j 1f; \
11412771Sqtt2@cornell.edu      2:j fail; \
11512771Sqtt2@cornell.edu      1:)
11612771Sqtt2@cornell.edu
11712771Sqtt2@cornell.edu  RVC_TEST_CASE (36, ra, -2, \
11812771Sqtt2@cornell.edu        la t0, 1f; \
11912771Sqtt2@cornell.edu        li ra, 0; \
12012771Sqtt2@cornell.edu        c.jalr t0; \
12112771Sqtt2@cornell.edu        c.j 2f; \
12212771Sqtt2@cornell.edu      1:c.j 1f; \
12312771Sqtt2@cornell.edu      2:j fail; \
12412771Sqtt2@cornell.edu      1:sub ra, ra, t0)
12512771Sqtt2@cornell.edu
12612771Sqtt2@cornell.edu#if __riscv_xlen == 32
12712771Sqtt2@cornell.edu  RVC_TEST_CASE (37, ra, -2, \
12812771Sqtt2@cornell.edu        la t0, 1f; \
12912771Sqtt2@cornell.edu        li ra, 0; \
13012771Sqtt2@cornell.edu        c.jal 1f; \
13112771Sqtt2@cornell.edu        c.j 2f; \
13212771Sqtt2@cornell.edu      1:c.j 1f; \
13312771Sqtt2@cornell.edu      2:j fail; \
13412771Sqtt2@cornell.edu      1:sub ra, ra, t0)
13512771Sqtt2@cornell.edu#endif
13612771Sqtt2@cornell.edu
13712771Sqtt2@cornell.edu  la sp, data
13812771Sqtt2@cornell.edu  RVC_TEST_CASE (40, a2, 0xfffffffffedcba99, c.lwsp a0, 12(sp); addi a0, a0, 1; c.swsp a0, 12(sp); c.lwsp a2, 12(sp))
13912771Sqtt2@cornell.edu#if __riscv_xlen == 64
14012771Sqtt2@cornell.edu  RVC_TEST_CASE (41, a2, 0xfedcba9976543211, c.ldsp a0, 8(sp); addi a0, a0, 1; c.sdsp a0, 8(sp); c.ldsp a2, 8(sp))
14112771Sqtt2@cornell.edu#endif
14212771Sqtt2@cornell.edu
14312771Sqtt2@cornell.edu  RVC_TEST_CASE (42, t0, 0x246, li a0, 0x123; c.mv t0, a0; c.add t0, a0)
14412771Sqtt2@cornell.edu
14512771Sqtt2@cornell.edu  .option pop
14612771Sqtt2@cornell.edu
14712771Sqtt2@cornell.edu  TEST_PASSFAIL
14812771Sqtt2@cornell.edu
14912771Sqtt2@cornell.eduRVTEST_CODE_END
15012771Sqtt2@cornell.edu
15112771Sqtt2@cornell.edu  .data
15212771Sqtt2@cornell.eduRVTEST_DATA_BEGIN
15312771Sqtt2@cornell.edu
15412771Sqtt2@cornell.eduRVTEST_DATA_END
155