rvc.S revision 12771:75508af5d8dc
11897Sstever@eecs.umich.edu# See LICENSE for license details.
23077Sstever@eecs.umich.edu
31897Sstever@eecs.umich.edu#*****************************************************************************
41897Sstever@eecs.umich.edu# rvc.S
51897Sstever@eecs.umich.edu#-----------------------------------------------------------------------------
61897Sstever@eecs.umich.edu#
71897Sstever@eecs.umich.edu# Test RVC corner cases.
81897Sstever@eecs.umich.edu#
91897Sstever@eecs.umich.edu
101897Sstever@eecs.umich.edu#include "riscv_test.h"
111897Sstever@eecs.umich.edu#include "test_macros.h"
121897Sstever@eecs.umich.edu
131897Sstever@eecs.umich.eduRVTEST_RV64U
141897Sstever@eecs.umich.eduRVTEST_CODE_BEGIN
151897Sstever@eecs.umich.edu
161897Sstever@eecs.umich.edu  .align 2
171897Sstever@eecs.umich.edu  .option push
181897Sstever@eecs.umich.edu  .option norvc
191897Sstever@eecs.umich.edu
201897Sstever@eecs.umich.edu  #define RVC_TEST_CASE(n, r, v, code...) \
211897Sstever@eecs.umich.edu    TEST_CASE (n, r, v, .option push; .option rvc; code; .align 2; .option pop)
221897Sstever@eecs.umich.edu
231897Sstever@eecs.umich.edu  // Make sure fetching a 4-byte instruction across a page boundary works.
241897Sstever@eecs.umich.edu  li TESTNUM, 2
251897Sstever@eecs.umich.edu  li a1, 666
261897Sstever@eecs.umich.edu  TEST_CASE (2, a1, 667, \
271897Sstever@eecs.umich.edu        j 1f; \
281897Sstever@eecs.umich.edu        .align 3; \
291897Sstever@eecs.umich.edu        data: \
301897Sstever@eecs.umich.edu          .dword 0xfedcba9876543210; \
311897Sstever@eecs.umich.edu          .dword 0xfedcba9876543210; \
321897Sstever@eecs.umich.edu        .align 12; \
331897Sstever@eecs.umich.edu        .skip 4094; \
341897Sstever@eecs.umich.edu      1: addi a1, a1, 1)
351897Sstever@eecs.umich.edu
361897Sstever@eecs.umich.edu  li sp, 0x1234
371897Sstever@eecs.umich.edu  RVC_TEST_CASE (3, a0, 0x1234 + 1020, c.addi4spn a0, sp, 1020)
381897Sstever@eecs.umich.edu  RVC_TEST_CASE (4, sp, 0x1234 + 496, c.addi16sp sp, 496)
391897Sstever@eecs.umich.edu  RVC_TEST_CASE (5, sp, 0x1234 + 496 - 512, c.addi16sp sp, -512)
401897Sstever@eecs.umich.edu
411897Sstever@eecs.umich.edu  la a1, data
423077Sstever@eecs.umich.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))
433099Sstever@eecs.umich.edu#if __riscv_xlen == 64
443099Sstever@eecs.umich.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))
451897Sstever@eecs.umich.edu#endif
461897Sstever@eecs.umich.edu
473099Sstever@eecs.umich.edu  RVC_TEST_CASE (8, a0, -15, ori a0, x0, 1; c.addi a0, -16)
483099Sstever@eecs.umich.edu  RVC_TEST_CASE (9, a5, -16, ori a5, x0, 1; c.li a5, -16)
491897Sstever@eecs.umich.edu#if __riscv_xlen == 64
503099Sstever@eecs.umich.edu  RVC_TEST_CASE (10, a0, 0x76543210, ld a0, (a1); c.addiw a0, -1)
511897Sstever@eecs.umich.edu#endif
521897Sstever@eecs.umich.edu
531897Sstever@eecs.umich.edu  RVC_TEST_CASE (11, s0, 0xffffffffffffffe1, c.lui s0, 0xfffe1; c.srai s0, 12)
541897Sstever@eecs.umich.edu#if __riscv_xlen == 64
551897Sstever@eecs.umich.edu  RVC_TEST_CASE (12, s0, 0x000fffffffffffe1, c.lui s0, 0xfffe1; c.srli s0, 12)
561897Sstever@eecs.umich.edu#else
571897Sstever@eecs.umich.edu  RVC_TEST_CASE (12, s0, 0x000fffe1, c.lui s0, 0xfffe1; c.srli s0, 12)
581897Sstever@eecs.umich.edu#endif
591897Sstever@eecs.umich.edu  RVC_TEST_CASE (14, s0, ~0x11, c.li s0, -2; c.andi s0, ~0x10)
601897Sstever@eecs.umich.edu  RVC_TEST_CASE (15, s1, 14, li s1, 20; li a0, 6; c.sub s1, a0)
611897Sstever@eecs.umich.edu  RVC_TEST_CASE (16, s1, 18, li s1, 20; li a0, 6; c.xor s1, a0)
621897Sstever@eecs.umich.edu  RVC_TEST_CASE (17, s1, 22, li s1, 20; li a0, 6; c.or s1, a0)
631897Sstever@eecs.umich.edu  RVC_TEST_CASE (18, s1,  4, li s1, 20; li a0, 6; c.and s1, a0)
641897Sstever@eecs.umich.edu#if __riscv_xlen == 64
651897Sstever@eecs.umich.edu  RVC_TEST_CASE (19, s1, 0xffffffff80000000, li s1, 0x7fffffff; li a0, -1; c.subw s1, a0)
661897Sstever@eecs.umich.edu  RVC_TEST_CASE (20, s1, 0xffffffff80000000, li s1, 0x7fffffff; li a0, 1; c.addw s1, a0)
671897Sstever@eecs.umich.edu#endif
681897Sstever@eecs.umich.edu  RVC_TEST_CASE (21, s0, 0x12340, li s0, 0x1234; c.slli s0, 4)
691897Sstever@eecs.umich.edu
701897Sstever@eecs.umich.edu  RVC_TEST_CASE (30, ra, 0, \
711897Sstever@eecs.umich.edu        li ra, 0; \
721897Sstever@eecs.umich.edu        c.j 1f; \
731897Sstever@eecs.umich.edu        c.j 2f; \
741897Sstever@eecs.umich.edu      1:c.j 1f; \
751897Sstever@eecs.umich.edu      2:j fail; \
761897Sstever@eecs.umich.edu      1:)
771897Sstever@eecs.umich.edu
781897Sstever@eecs.umich.edu  RVC_TEST_CASE (31, x0, 0, \
791897Sstever@eecs.umich.edu        li a0, 0; \
801897Sstever@eecs.umich.edu        c.beqz a0, 1f; \
813077Sstever@eecs.umich.edu        c.j 2f; \
823077Sstever@eecs.umich.edu      1:c.j 1f; \
833077Sstever@eecs.umich.edu      2:j fail; \
843077Sstever@eecs.umich.edu      1:)
853077Sstever@eecs.umich.edu
863077Sstever@eecs.umich.edu  RVC_TEST_CASE (32, x0, 0, \
873077Sstever@eecs.umich.edu        li a0, 1; \
883077Sstever@eecs.umich.edu        c.bnez a0, 1f; \
893077Sstever@eecs.umich.edu        c.j 2f; \
901897Sstever@eecs.umich.edu      1:c.j 1f; \
911897Sstever@eecs.umich.edu      2:j fail; \
921897Sstever@eecs.umich.edu      1:)
931897Sstever@eecs.umich.edu
941897Sstever@eecs.umich.edu  RVC_TEST_CASE (33, x0, 0, \
951897Sstever@eecs.umich.edu        li a0, 1; \
961897Sstever@eecs.umich.edu        c.beqz a0, 1f; \
971897Sstever@eecs.umich.edu        c.j 2f; \
98      1:c.j fail; \
99      2:)
100
101  RVC_TEST_CASE (34, x0, 0, \
102        li a0, 0; \
103        c.bnez a0, 1f; \
104        c.j 2f; \
105      1:c.j fail; \
106      2:)
107
108  RVC_TEST_CASE (35, ra, 0, \
109        la t0, 1f; \
110        li ra, 0; \
111        c.jr t0; \
112        c.j 2f; \
113      1:c.j 1f; \
114      2:j fail; \
115      1:)
116
117  RVC_TEST_CASE (36, ra, -2, \
118        la t0, 1f; \
119        li ra, 0; \
120        c.jalr t0; \
121        c.j 2f; \
122      1:c.j 1f; \
123      2:j fail; \
124      1:sub ra, ra, t0)
125
126#if __riscv_xlen == 32
127  RVC_TEST_CASE (37, ra, -2, \
128        la t0, 1f; \
129        li ra, 0; \
130        c.jal 1f; \
131        c.j 2f; \
132      1:c.j 1f; \
133      2:j fail; \
134      1:sub ra, ra, t0)
135#endif
136
137  la sp, data
138  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))
139#if __riscv_xlen == 64
140  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))
141#endif
142
143  RVC_TEST_CASE (42, t0, 0x246, li a0, 0x123; c.mv t0, a0; c.add t0, a0)
144
145  .option pop
146
147  TEST_PASSFAIL
148
149RVTEST_CODE_END
150
151  .data
152RVTEST_DATA_BEGIN
153
154RVTEST_DATA_END
155