4f2675ad7944970dc45d89a0923e33d39e404638
[riscv-tests.git] / isa / rv64uc / rvc.S
1 # See LICENSE for license details.
2
3 #*****************************************************************************
4 # rvc.S
5 #-----------------------------------------------------------------------------
6 #
7 # Test RVC corner cases.
8 #
9
10 #include "riscv_test.h"
11 #include "test_macros.h"
12
13 RVTEST_RV64U
14 RVTEST_CODE_BEGIN
15
16 .option push
17 .option norvc
18
19 #define RVC_TEST_CASE(n, r, v, code...) \
20 TEST_CASE (n, r, v, .option push; .option rvc; code; .option pop)
21
22 // Make sure fetching a 4-byte instruction across a page boundary works.
23 li TESTNUM, 2
24 li a1, 666
25 li a2, 1
26 RVC_TEST_CASE (2, a1, 2, \
27 j 1f; \
28 .align 12; \
29 .skip 4094; \
30 1: addi a1, a2, 1)
31
32 li sp, 0x1234
33 RVC_TEST_CASE (3, a0, 0x1234 + 1020, c.addi4spn a0, sp, 1020)
34 RVC_TEST_CASE (4, sp, 0x1234 + 496, c.addi16sp sp, 496)
35 RVC_TEST_CASE (5, sp, 0x1234 + 496 - 512, c.addi16sp sp, -512)
36
37 la a1, data
38 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))
39 #ifdef __riscv64
40 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))
41 #endif
42
43 RVC_TEST_CASE (8, a0, -15, ori a0, x0, 1; c.addi a0, -16)
44 RVC_TEST_CASE (9, a5, -16, ori a5, x0, 1; c.li a5, -16)
45 #ifdef __riscv64
46 RVC_TEST_CASE (10, a0, 0x76543210, ld a0, (a1); c.addiw a0, -1)
47 #endif
48
49 RVC_TEST_CASE (11, s0, 0xffffffffffffffe1, c.lui s0, 0xfffe1; c.srai s0, 12)
50 RVC_TEST_CASE (12, s0, 0x000fffffffffffe1, c.lui s0, 0xfffe1; c.srli s0, 12)
51 RVC_TEST_CASE (13, s0, 0x000fffffffffffe1, c.lui s0, 0xfffe1; c.srli s0, 12)
52 RVC_TEST_CASE (14, s0, ~0x11, c.li s0, -2; c.andi s0, ~0x10)
53 RVC_TEST_CASE (15, s1, 14, li s1, 20; li a0, 6; c.sub s1, a0)
54 RVC_TEST_CASE (16, s1, 18, li s1, 20; li a0, 6; c.xor s1, a0)
55 RVC_TEST_CASE (17, s1, 22, li s1, 20; li a0, 6; c.or s1, a0)
56 RVC_TEST_CASE (18, s1, 4, li s1, 20; li a0, 6; c.and s1, a0)
57 #ifdef __riscv64
58 RVC_TEST_CASE (19, s1, 0xffffffff80000000, li s1, 0x7fffffff; li a0, -1; c.subw s1, a0)
59 RVC_TEST_CASE (20, s1, 0xffffffff80000000, li s1, 0x7fffffff; li a0, 1; c.addw s1, a0)
60 #endif
61 RVC_TEST_CASE (21, s0, 0x12340, li s0, 0x1234; c.slli s0, 4)
62
63 RVC_TEST_CASE (30, ra, 0, \
64 li ra, 0; \
65 c.j 1f; \
66 c.j 2f; \
67 1:c.j 1f; \
68 2:j fail; \
69 1:)
70
71 RVC_TEST_CASE (31, x0, 0, \
72 li a0, 0; \
73 c.beqz a0, 1f; \
74 c.j 2f; \
75 1:c.j 1f; \
76 2:j fail; \
77 1:)
78
79 RVC_TEST_CASE (32, x0, 0, \
80 li a0, 1; \
81 c.bnez a0, 1f; \
82 c.j 2f; \
83 1:c.j 1f; \
84 2:j fail; \
85 1:)
86
87 RVC_TEST_CASE (33, x0, 0, \
88 li a0, 1; \
89 c.beqz a0, 1f; \
90 c.j 2f; \
91 1:c.j fail; \
92 2:)
93
94 RVC_TEST_CASE (34, x0, 0, \
95 li a0, 0; \
96 c.bnez a0, 1f; \
97 c.j 2f; \
98 1:c.j fail; \
99 2:)
100
101 RVC_TEST_CASE (35, ra, 0, \
102 la t0, 1f; \
103 li ra, 0; \
104 c.jr t0; \
105 c.j 2f; \
106 1:c.j 1f; \
107 2:j fail; \
108 1:)
109
110 RVC_TEST_CASE (36, ra, -2, \
111 la t0, 1f; \
112 li ra, 0; \
113 c.jalr t0; \
114 c.j 2f; \
115 1:c.j 1f; \
116 2:j fail; \
117 1:sub ra, ra, t0)
118
119 #ifdef __riscv32
120 RVC_TEST_CASE (37, ra, -2, \
121 la t0, 1f; \
122 li ra, 0; \
123 c.jal 1f; \
124 c.j 2f; \
125 1:c.j 1f; \
126 2:j fail; \
127 1:sub ra, ra, t0)
128 #endif
129
130 la sp, data
131 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))
132 #ifdef __riscv64
133 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))
134 #endif
135
136 RVC_TEST_CASE (42, t0, 0x246, li a0, 0x123; c.mv t0, a0; c.add t0, a0)
137
138 .option pop
139
140 TEST_PASSFAIL
141
142 RVTEST_CODE_END
143
144 .data
145 RVTEST_DATA_BEGIN
146
147 data:
148 .dword 0xfedcba9876543210
149 .dword 0xfedcba9876543210
150
151 RVTEST_DATA_END