Skip to content

Commit 4b323c2

Browse files
committed
rvp: add new instructions added by 0.20
The complete set of instructions added for RV32 are: PSSHL.HS SSHL PSSHL.DHS PSSHL.DWS PSSHLR.HS SSHLR PSSHLR.DHS PSSHLR.DWS And for RV64: PSSHL.HS PSSHL.WS SHL PNCLIPP.B PNCLIPP.H PNCLIPP.W PSSHLR.HS PSSHLR.WS SHLR PNCLIPUP.B PNCLIPUP.H PNCLIPUP.W reference: https://www.jhauser.us/RISCV/ext-P/RVP-instrEncodings-020.pdf https://www.jhauser.us/RISCV/ext-P/RVP-baseInstrs-Sail-020.txt Signed-off-by: Chih-Min Chao <chihmin.chao@sifive.com>
1 parent 90549e8 commit 4b323c2

23 files changed

Lines changed: 1421 additions & 23 deletions

isa/macros/scalar/test_macros.h

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -148,6 +148,20 @@ test_ ## testnum: \
148148
inst x14, x11, x12; \
149149
)
150150

151+
# RV32 P-extension register-pair register-register tests.
152+
# rs1 pair = {x13, x12} (even base), rd pair = {x15, x14}, rs2 = x11.
153+
# Both halves of result are checked; on mismatch we jump to the same fail
154+
# label as TEST_CASE, so the reported testnum matches.
155+
#define TEST_RR_OP_PAIR( testnum, inst, result, val1, val2 ) \
156+
TEST_CASE( testnum, x14, ((result) & 0xFFFFFFFF), \
157+
li x12, ((val1) & 0xFFFFFFFF); \
158+
li x13, (((val1) >> 32) & 0xFFFFFFFF); \
159+
li x11, MASK_XLEN(val2); \
160+
inst x14, x12, x11; \
161+
) \
162+
li x7, (((result) >> 32) & 0xFFFFFFFF); \
163+
bne x15, x7, fail;
164+
151165
#define TEST_RR_SRC1_EQ_DEST( testnum, inst, result, val1, val2 ) \
152166
TEST_CASE( testnum, x11, result, \
153167
li x11, MASK_XLEN(val1); \

isa/rv32up/Makefrag

Lines changed: 23 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@ rv32up_sc_tests = \
2222
psll_bs psll_hs pslli_b pslli_h psra_bs psra_hs psrai_b psrai_h \
2323
psrari_h psrl_bs psrl_hs psrli_b psrli_h pssha_hs psshar_hs psslai_h \
2424
srari ssha sshar sslai \
25+
sshl sshlr psshl_hs psshlr_hs \
2526
pmax_b pmax_h pmaxu_b pmaxu_h pmin_b pmin_h pminu_b pminu_h \
2627
pmseq_b pmseq_h pmslt_b pmslt_h pmsltu_b pmsltu_h \
2728
mseq mslt msltu \
@@ -59,30 +60,29 @@ rv32up_sc_tests = \
5960
pwmul_b pwmul_h pwmulsu_b pwmulsu_h pwmulu_b pwmulu_h wmul wmulsu wmulu \
6061
pwmacc_h pwmaccsu_h pwmaccu_h wmacc wmaccsu wmaccu \
6162
mqwacc pmqwacc_h mqrwacc pmqrwacc_h \
62-
psll_dbs psll_dhs psll_dws pslli_db pslli_dh pslli_dw \
63-
psra_dbs psra_dhs psra_dws psrl_dbs psrl_dhs psrl_dws \
64-
pssha_dhs pssha_dws psshar_dhs psshar_dws psslai_dh psslai_dw \
65-
wslai wslli \
66-
pmax_db pmax_dh pmax_dw pmaxu_db pmaxu_dh pmaxu_dw \
67-
pmin_db pmin_dh pmin_dw pminu_db pminu_dh pminu_dw \
68-
pmseq_db pmseq_dh pmseq_dw pmslt_db pmslt_dh pmslt_dw \
69-
pmsltu_db pmsltu_dh pmsltu_dw \
70-
ppaire_db ppaire_dh ppaireo_db ppaireo_dh \
71-
ppairo_db ppairo_dh ppairoe_db ppairoe_dh \
72-
pnsra_bs pnsra_hs pnsrai_b pnsrai_h pnsrar_bs pnsrar_hs \
73-
pnsrari_b pnsrari_h pnsrl_bs pnsrl_hs pnsrli_b pnsrli_h \
74-
pnclip_bs pnclip_hs pnclipi_b pnclipi_h pnclipiu_b pnclipiu_h \
75-
pnclipr_bs pnclipr_hs pnclipri_b pnclipri_h pnclipriu_b pnclipriu_h \
76-
pnclipru_bs pnclipru_hs pnclipu_bs pnclipu_hs \
77-
pm2wadd_h pm2wadd_hx pm2wadda_h pm2wadda_hx pm2waddu_h pm2waddsu_h \
78-
pm2waddau_h pm2waddasu_h pm2wsub_h pm2wsub_hx pm2wsuba_h pm2wsuba_hx \
79-
nsrai nsrli nsrari nclipi nclipiu nclipri nclipriu \
80-
nclip nclipu nclipr nclipru \
81-
nsra nsrl nsrar \
82-
wzip8p wzip16p \
83-
63+
psll_dbs psll_dhs psll_dws pslli_db pslli_dh pslli_dw \
64+
psra_dbs psra_dhs psra_dws psrl_dbs psrl_dhs psrl_dws \
65+
pssha_dhs pssha_dws psshar_dhs psshar_dws psslai_dh psslai_dw \
66+
psshl_dhs psshl_dws psshlr_dhs psshlr_dws \
67+
wslai wslli \
68+
pmax_db pmax_dh pmax_dw pmaxu_db pmaxu_dh pmaxu_dw \
69+
pmin_db pmin_dh pmin_dw pminu_db pminu_dh pminu_dw \
70+
pmseq_db pmseq_dh pmseq_dw pmslt_db pmslt_dh pmslt_dw \
71+
pmsltu_db pmsltu_dh pmsltu_dw \
72+
ppaire_db ppaire_dh ppaireo_db ppaireo_dh \
73+
ppairo_db ppairo_dh ppairoe_db ppairoe_dh \
74+
pnsra_bs pnsra_hs pnsrai_b pnsrai_h pnsrar_bs pnsrar_hs \
75+
pnsrari_b pnsrari_h pnsrl_bs pnsrl_hs pnsrli_b pnsrli_h \
76+
pnclip_bs pnclip_hs pnclipi_b pnclipi_h pnclipiu_b pnclipiu_h \
77+
pnclipr_bs pnclipr_hs pnclipri_b pnclipri_h pnclipriu_b pnclipriu_h \
78+
pnclipru_bs pnclipru_hs pnclipu_bs pnclipu_hs \
79+
pm2wadd_h pm2wadd_hx pm2wadda_h pm2wadda_hx pm2waddu_h pm2waddsu_h \
80+
pm2waddau_h pm2waddasu_h pm2wsub_h pm2wsub_hx pm2wsuba_h pm2wsuba_hx \
81+
nsrai nsrli nsrari nclipi nclipiu nclipri nclipriu \
82+
nclip nclipu nclipr nclipru \
83+
nsra nsrl nsrar \
84+
wzip8p wzip16p \
8485
psati_dh psati_dw pusati_dh pusati_dw \
85-
8686
psrai_db psrai_dh psrai_dw psrari_dh psrari_dw psrli_db psrli_dh psrli_dw \
8787

8888
rv32up_p_tests = $(addprefix rv32up-p-, $(rv32up_sc_tests))

isa/rv32up/psshl_dhs.S

Lines changed: 67 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,67 @@
1+
# See LICENSE for license details.
2+
3+
#*****************************************************************************
4+
# psshl_dhs.S
5+
#-----------------------------------------------------------------------------
6+
#
7+
# Test psshl.dhs instruction (packed saturating shift left double-word halfword).
8+
# RV32-only instruction using register pairs for 64-bit operations.
9+
# Equivalent to psshl.hs on each 32-bit register in the pair.
10+
#
11+
12+
#include "riscv_test.h"
13+
#include "test_macros.h"
14+
15+
RVTEST_RV32U
16+
RVTEST_CODE_BEGIN
17+
18+
#-------------------------------------------------------------
19+
# Arithmetic tests
20+
#-------------------------------------------------------------
21+
22+
# psshl.dhs rd, rs1, rs2
23+
# Operates on register pair (rd, rd+1) and (rs1, rs1+1)
24+
# Equivalent to: psshl.hs rd, rs1, rs2; psshl.hs rd+1, rs1+1, rs2
25+
26+
# Test case 1: Left shift without saturation
27+
# rs1 pair = 0x00050005_00050005, rs2 = 0x00000002
28+
# Expected: 0x00140014_00140014
29+
TEST_RR_OP_PAIR( 2, psshl.dhs, 0x0014001400140014, 0x0005000500050005, 2 );
30+
31+
# Test case 2: Left shift with saturation
32+
# rs1 pair = 0x40004000_40004000, rs2 = 0x00000002
33+
# Expected: 0xFFFFFFFF_FFFFFFFF
34+
TEST_RR_OP_PAIR( 3, psshl.dhs, 0xFFFFFFFFFFFFFFFF, 0x4000400040004000, 2 );
35+
36+
# Test case 3: Right shift (negative shamt)
37+
# rs1 pair = 0x80008000_80008000, rs2 = 0xFFFFFFFC (shift right by 4)
38+
# Expected: 0x08000800_08000800
39+
TEST_RR_OP_PAIR( 4, psshl.dhs, 0x0800080008000800, 0x8000800080008000, -4 );
40+
41+
# Test case 4: Left shift by 0
42+
# rs1 pair = 0x12345678_9ABCDEF0, rs2 = 0x00000000
43+
# Expected: 0x12345678_9ABCDEF0
44+
TEST_RR_OP_PAIR( 5, psshl.dhs, 0x123456789ABCDEF0, 0x123456789ABCDEF0, 0 );
45+
46+
# Test case 5: Saturation with maximum value
47+
# rs1 pair = 0x7FFF7FFF_7FFF7FFF, rs2 = 0x00000002
48+
# Expected: 0xFFFFFFFF_FFFFFFFF
49+
TEST_RR_OP_PAIR( 6, psshl.dhs, 0xFFFFFFFFFFFFFFFF, 0x7FFF7FFF7FFF7FFF, 2 );
50+
51+
# Test case 6: Zero shifted
52+
# rs1 pair = 0x00000000_00000000, rs2 = 0x00000005
53+
# Expected: 0x00000000_00000000
54+
TEST_RR_OP_PAIR( 7, psshl.dhs, 0x0000000000000000, 0x0000000000000000, 5 );
55+
56+
TEST_PASSFAIL
57+
58+
RVTEST_CODE_END
59+
60+
.data
61+
RVTEST_DATA_BEGIN
62+
63+
TEST_DATA
64+
65+
RVTEST_DATA_END
66+
67+

isa/rv32up/psshl_dws.S

Lines changed: 61 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,61 @@
1+
# See LICENSE for license details.
2+
3+
#*****************************************************************************
4+
# psshl_dws.S
5+
#-----------------------------------------------------------------------------
6+
#
7+
# Test psshl.dws instruction (packed saturating shift left double-word word).
8+
# RV32-only instruction using register pairs for 64-bit operations.
9+
# Equivalent to sshl on each 32-bit register in the pair.
10+
#
11+
12+
#include "riscv_test.h"
13+
#include "test_macros.h"
14+
15+
RVTEST_RV32U
16+
RVTEST_CODE_BEGIN
17+
18+
#-------------------------------------------------------------
19+
# Arithmetic tests
20+
#-------------------------------------------------------------
21+
22+
# psshl.dws rd, rs1, rs2
23+
# Operates on register pair (rd, rd+1) and (rs1, rs1+1)
24+
# Equivalent to: sshl rd, rs1, rs2; sshl rd+1, rs1+1, rs2
25+
26+
# Test case 1: Left shift without saturation
27+
# rs1 pair = 0x00000005_00000005, rs2 = 0x00000002
28+
# Expected: 0x00000014_00000014
29+
TEST_RR_OP_PAIR( 2, psshl.dws, 0x0000001400000014, 0x0000000500000005, 2 );
30+
31+
# Test case 2: Left shift with saturation
32+
# rs1 pair = 0x40000000_40000000, rs2 = 0x00000002
33+
# Expected: 0xFFFFFFFF_FFFFFFFF
34+
TEST_RR_OP_PAIR( 3, psshl.dws, 0xFFFFFFFFFFFFFFFF, 0x4000000040000000, 2 );
35+
36+
# Test case 3: Right shift (negative shamt)
37+
# rs1 pair = 0x80000000_80000000, rs2 = 0xFFFFFFFC (shift right by 4)
38+
# Expected: 0x08000000_08000000
39+
TEST_RR_OP_PAIR( 4, psshl.dws, 0x0800000008000000, 0x8000000080000000, -4 );
40+
41+
# Test case 4: Left shift by 0
42+
# rs1 pair = 0x12345678_9ABCDEF0, rs2 = 0x00000000
43+
# Expected: 0x12345678_9ABCDEF0
44+
TEST_RR_OP_PAIR( 5, psshl.dws, 0x123456789ABCDEF0, 0x123456789ABCDEF0, 0 );
45+
46+
# Test case 5: Saturation with maximum value
47+
# rs1 pair = 0x7FFFFFFF_7FFFFFFF, rs2 = 0x00000002
48+
# Expected: 0xFFFFFFFF_FFFFFFFF
49+
TEST_RR_OP_PAIR( 6, psshl.dws, 0xFFFFFFFFFFFFFFFF, 0x7FFFFFFF7FFFFFFF, 2);
50+
51+
TEST_PASSFAIL
52+
53+
RVTEST_CODE_END
54+
55+
.data
56+
RVTEST_DATA_BEGIN
57+
58+
TEST_DATA
59+
60+
RVTEST_DATA_END
61+

isa/rv32up/psshl_hs.S

Lines changed: 87 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,87 @@
1+
# See LICENSE for license details.
2+
3+
#*****************************************************************************
4+
# psshl_hs.S
5+
#-----------------------------------------------------------------------------
6+
#
7+
# Test psshl.hs instruction (packed saturating shift left halfword).
8+
# Bidirectional saturating shift on each 16-bit element:
9+
# positive shamt = left shift with saturation, negative shamt = right shift (logical).
10+
#
11+
12+
#include "riscv_test.h"
13+
#include "test_macros.h"
14+
15+
RVTEST_RV32U
16+
RVTEST_CODE_BEGIN
17+
18+
#-------------------------------------------------------------
19+
# Arithmetic tests
20+
#-------------------------------------------------------------
21+
22+
# psshl.hs rd, rs1, rs2
23+
# For each 16-bit element:
24+
# If rs2[7:0] >= 0: left shift with saturation to 16-bit max
25+
# If rs2[7:0] < 0: right shift logical
26+
27+
# Test case 1: Left shift without saturation
28+
# rs1 = 0x00050005, rs2 = 0x00000002 (shift left by 2)
29+
# Expected: 0x00140014 (5 << 2 = 20 in each halfword)
30+
TEST_RR_OP( 2, psshl.hs, 0x00140014, 0x00050005, 0x00000002 );
31+
32+
# Test case 2: Left shift with saturation
33+
# rs1 = 0x40004000, rs2 = 0x00000002 (shift left by 2)
34+
# Expected: 0xFFFFFFFF (saturated to 0xFFFF in each halfword)
35+
TEST_RR_OP( 3, psshl.hs, 0xFFFFFFFF, 0x40004000, 0x00000002 );
36+
37+
# Test case 3: Left shift by 0
38+
# rs1 = 0x12345678, rs2 = 0x00000000
39+
# Expected: 0x12345678 (no change)
40+
TEST_RR_OP( 4, psshl.hs, 0x12345678, 0x12345678, 0x00000000 );
41+
42+
# Test case 4: Left shift by large amount (>= 16)
43+
# rs1 = 0x00010001, rs2 = 0x00000010 (shift left by 16)
44+
# Expected: 0x00000000 (result is 0 in each halfword)
45+
TEST_RR_OP( 5, psshl.hs, 0x00000000, 0x00010001, 0x00000010 );
46+
47+
# Test case 5: Right shift (negative shamt)
48+
# rs1 = 0x80008000, rs2 = 0xFFFFFFFC (shift right by 4)
49+
# Expected: 0x08000800 (logical right shift in each halfword)
50+
TEST_RR_OP( 6, psshl.hs, 0x08000800, 0x80008000, 0xFFFFFFFC );
51+
52+
# Test case 6: Right shift by large negative amount (<= -16)
53+
# rs1 = 0xFFFFFFFF, rs2 = 0xFFFFFFF0 (shift right by 16)
54+
# Expected: 0x00000000
55+
TEST_RR_OP( 7, psshl.hs, 0x00000000, 0xFFFFFFFF, 0xFFFFFFF0 );
56+
57+
# Test case 7: Right shift by -1
58+
# rs1 = 0x12345678, rs2 = 0xFFFFFFFF (shift right by 1)
59+
# Expected: 0x091A2B3C
60+
TEST_RR_OP( 8, psshl.hs, 0x091A2B3C, 0x12345678, 0xFFFFFFFF );
61+
62+
# Test case 8: 0x7FFF << 1 = 0xFFFE in zero-extended 32-bit, no unsigned 16-bit saturation
63+
# rs1 = 0x7FFF7FFF, rs2 = 0x00000001 (shift left by 1) -> 0xFFFEFFFE
64+
TEST_RR_OP( 9, psshl.hs, 0xFFFEFFFE, 0x7FFF7FFF, 0x00000001 );
65+
66+
# Test case 9: Zero shifted
67+
# rs1 = 0x00000000, rs2 = 0x00000005
68+
# Expected: 0x00000000
69+
TEST_RR_OP( 10, psshl.hs, 0x00000000, 0x00000000, 0x00000005 );
70+
71+
# Test case 10: Mixed values
72+
# rs1 = 0x0001FFFF, rs2 = 0x00000001 (shift left by 1)
73+
# Expected: 0x0002FFFF (0x0001 << 1 = 0x0002, 0xFFFF saturates to 0xFFFF)
74+
TEST_RR_OP( 11, psshl.hs, 0x0002FFFF, 0x0001FFFF, 0x00000001 );
75+
76+
TEST_PASSFAIL
77+
78+
RVTEST_CODE_END
79+
80+
.data
81+
RVTEST_DATA_BEGIN
82+
83+
TEST_DATA
84+
85+
RVTEST_DATA_END
86+
87+

isa/rv32up/psshlr_dhs.S

Lines changed: 67 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,67 @@
1+
# See LICENSE for license details.
2+
3+
#*****************************************************************************
4+
# psshl_dhs.S
5+
#-----------------------------------------------------------------------------
6+
#
7+
# Test psshlr.dhs instruction (packed saturating shift left with rounding double-word halfword).
8+
# RV32-only instruction using register pairs for 64-bit operations.
9+
# Equivalent to psshlr.hs on each 32-bit register in the pair.
10+
#
11+
12+
#include "riscv_test.h"
13+
#include "test_macros.h"
14+
15+
RVTEST_RV32U
16+
RVTEST_CODE_BEGIN
17+
18+
#-------------------------------------------------------------
19+
# Arithmetic tests
20+
#-------------------------------------------------------------
21+
22+
# psshl.dhs rd, rs1, rs2
23+
# Operates on register pair (rd, rd+1) and (rs1, rs1+1)
24+
# Equivalent to: psshlr.hs rd, rs1, rs2; psshlr.hs rd+1, rs1+1, rs2
25+
26+
# Test case 1: Left shift without saturation
27+
# rs1 pair = 0x00050005_00050005, rs2 = 0x00000002
28+
# Expected: 0x00140014_00140014
29+
TEST_RR_OP_PAIR( 2, psshlr.dhs, 0x0014001400140014, 0x0005000500050005, 2 );
30+
31+
# Test case 2: Left shift with saturation
32+
# rs1 pair = 0x40004000_40004000, rs2 = 0x00000002
33+
# Expected: 0xFFFFFFFF_FFFFFFFF
34+
TEST_RR_OP_PAIR( 3, psshlr.dhs, 0xFFFFFFFFFFFFFFFF, 0x4000400040004000, 2 );
35+
36+
# Test case 3: Right shift (negative shamt)
37+
# rs1 pair = 0x80008000_80008000, rs2 = 0xFFFFFFFC (shift right by 4)
38+
# Expected: 0x08000800_08000800
39+
TEST_RR_OP_PAIR( 4, psshlr.dhs, 0x0800080008000800, 0x8000800080008000, -4 );
40+
41+
# Test case 4: Left shift by 0
42+
# rs1 pair = 0x12345678_9ABCDEF0, rs2 = 0x00000000
43+
# Expected: 0x12345678_9ABCDEF0
44+
TEST_RR_OP_PAIR( 5, psshlr.dhs, 0x123456789ABCDEF0, 0x123456789ABCDEF0, 0 );
45+
46+
# Test case 5: Saturation with maximum value
47+
# rs1 pair = 0x7FFF7FFF_7FFF7FFF, rs2 = 0x00000002
48+
# Expected: 0xFFFFFFFF_FFFFFFFF
49+
TEST_RR_OP_PAIR( 6, psshlr.dhs, 0xFFFFFFFFFFFFFFFF, 0x7FFF7FFF7FFF7FFF, 2 );
50+
51+
# Test case 6: Zero shifted
52+
# rs1 pair = 0x00000000_00000000, rs2 = 0x00000005
53+
# Expected: 0x00000000_00000000
54+
TEST_RR_OP_PAIR( 7, psshlr.dhs, 0x0000000000000000, 0x0000000000000000, 5 );
55+
56+
TEST_PASSFAIL
57+
58+
RVTEST_CODE_END
59+
60+
.data
61+
RVTEST_DATA_BEGIN
62+
63+
TEST_DATA
64+
65+
RVTEST_DATA_END
66+
67+

0 commit comments

Comments
 (0)