xref: /openbmc/qemu/target/riscv/xthead.decode (revision 5c71a911267f742a71e2c7725dd3164347c61738)
149a7f3aaSChristoph Müllner#
249a7f3aaSChristoph Müllner# Translation routines for the instructions of the XThead* ISA extensions
349a7f3aaSChristoph Müllner#
449a7f3aaSChristoph Müllner# Copyright (c) 2022 Christoph Muellner, christoph.muellner@vrull.eu
5c9410a68SChristoph Müllner#                    Dr. Philipp Tomsich, philipp.tomsich@vrull.eu
649a7f3aaSChristoph Müllner#
749a7f3aaSChristoph Müllner# SPDX-License-Identifier: LGPL-2.1-or-later
849a7f3aaSChristoph Müllner#
949a7f3aaSChristoph Müllner# The documentation of the ISA extensions can be found here:
1049a7f3aaSChristoph Müllner#   https://github.com/T-head-Semi/thead-extension-spec/releases/latest
1149a7f3aaSChristoph Müllner
1249a7f3aaSChristoph Müllner# Fields:
13c9410a68SChristoph Müllner%rd        7:5
14af99aa72SChristoph Müllner%rd1       7:5
15af99aa72SChristoph Müllner%rs        15:5
1649a7f3aaSChristoph Müllner%rs1       15:5
17af99aa72SChristoph Müllner%rd2       20:5
18134c3ffaSChristoph Müllner%rs2       20:5
19426c0491SChristoph Müllner%sh5       20:5
2045f9df86SChristoph Müllner%imm5      20:s5
21426c0491SChristoph Müllner%sh6       20:6
22af99aa72SChristoph Müllner%sh2       25:2
2345f9df86SChristoph Müllner%imm2      25:2
2449a7f3aaSChristoph Müllner
25c9410a68SChristoph Müllner# Argument sets
26c9410a68SChristoph Müllner&r         rd rs1 rs2                               !extern
27426c0491SChristoph Müllner&r2        rd rs1                                   !extern
28426c0491SChristoph Müllner&shift     shamt rs1 rd                             !extern
29426c0491SChristoph Müllner&th_bfext  msb lsb rs1 rd
30af99aa72SChristoph Müllner&th_pair   rd1 rs rd2 sh2
3145f9df86SChristoph Müllner&th_memidx rd rs1 rs2 imm2
3245f9df86SChristoph Müllner&th_meminc rd rs1 imm5 imm2
33c9410a68SChristoph Müllner
3449a7f3aaSChristoph Müllner# Formats
3549a7f3aaSChristoph Müllner@sfence_vm  ....... ..... .....   ... ..... ....... %rs1
36134c3ffaSChristoph Müllner@rs2_s      ....... ..... ..... ... ..... .......   %rs2 %rs1
37c9410a68SChristoph Müllner@r          ....... ..... .....  ... ..... .......  &r %rs2 %rs1 %rd
38426c0491SChristoph Müllner@r2         ....... ..... .....  ... ..... .......  &r2 %rs1 %rd
39426c0491SChristoph Müllner@th_bfext   msb:6  lsb:6  .....  ... ..... .......  &th_bfext %rs1 %rd
40426c0491SChristoph Müllner@sh5        ....... ..... .....  ... ..... .......  &shift  shamt=%sh5      %rs1 %rd
41426c0491SChristoph Müllner@sh6        ...... ...... .....  ... ..... .......  &shift shamt=%sh6 %rs1 %rd
42af99aa72SChristoph Müllner@th_pair    ..... .. ..... ..... ... ..... .......  &th_pair %rd1 %rs %rd2 %sh2
4345f9df86SChristoph Müllner@th_memidx  ..... .. ..... ..... ... ..... .......  &th_memidx %rd %rs1 %rs2 %imm2
4445f9df86SChristoph Müllner@th_meminc  ..... .. ..... ..... ... ..... .......  &th_meminc %rd %rs1 %imm5 %imm2
45c9410a68SChristoph Müllner
46c9410a68SChristoph Müllner# XTheadBa
47c9410a68SChristoph Müllner# Instead of defining a new encoding, we simply use the decoder to
48c9410a68SChristoph Müllner# extract the imm[0:1] field and dispatch to separate translation
49c9410a68SChristoph Müllner# functions (mirroring the `sh[123]add` instructions from Zba and
50c9410a68SChristoph Müllner# the regular RVI `add` instruction.
51c9410a68SChristoph Müllner#
52c9410a68SChristoph Müllner# The only difference between sh[123]add and addsl is that the shift
53c9410a68SChristoph Müllner# is applied to rs1 (for addsl) instead of rs2 (for sh[123]add).
54c9410a68SChristoph Müllner#
55c9410a68SChristoph Müllner# Note that shift-by-0 is a valid operation according to the manual.
56c9410a68SChristoph Müllner# This will be equivalent to a regular add.
57c9410a68SChristoph Müllneradd              0000000 ..... ..... 001 ..... 0001011 @r
58c9410a68SChristoph Müllnerth_addsl1        0000001 ..... ..... 001 ..... 0001011 @r
59c9410a68SChristoph Müllnerth_addsl2        0000010 ..... ..... 001 ..... 0001011 @r
60c9410a68SChristoph Müllnerth_addsl3        0000011 ..... ..... 001 ..... 0001011 @r
6149a7f3aaSChristoph Müllner
62426c0491SChristoph Müllner# XTheadBb
63426c0491SChristoph Müllnerth_ext           ...... ...... ..... 010 ..... 0001011 @th_bfext
64426c0491SChristoph Müllnerth_extu          ...... ...... ..... 011 ..... 0001011 @th_bfext
65426c0491SChristoph Müllnerth_ff0           1000010 00000 ..... 001 ..... 0001011 @r2
66426c0491SChristoph Müllnerth_ff1           1000011 00000 ..... 001 ..... 0001011 @r2
67426c0491SChristoph Müllnerth_srri          000100 ...... ..... 001 ..... 0001011 @sh6
68426c0491SChristoph Müllnerth_srriw         0001010 ..... ..... 001 ..... 0001011 @sh5
69426c0491SChristoph Müllnerth_rev           1000001 00000 ..... 001 ..... 0001011 @r2
70426c0491SChristoph Müllnerth_revw          1001000 00000 ..... 001 ..... 0001011 @r2
71426c0491SChristoph Müllnerth_tstnbz        1000000 00000 ..... 001 ..... 0001011 @r2
72426c0491SChristoph Müllner
73fa134585SChristoph Müllner# XTheadBs
74fa134585SChristoph Müllnerth_tst           100010 ...... ..... 001 ..... 0001011 @sh6
75fa134585SChristoph Müllner
7649a7f3aaSChristoph Müllner# XTheadCmo
7749a7f3aaSChristoph Müllnerth_dcache_call   0000000 00001 00000 000 00000 0001011
7849a7f3aaSChristoph Müllnerth_dcache_ciall  0000000 00011 00000 000 00000 0001011
7949a7f3aaSChristoph Müllnerth_dcache_iall   0000000 00010 00000 000 00000 0001011
8049a7f3aaSChristoph Müllnerth_dcache_cpa    0000001 01001 ..... 000 00000 0001011 @sfence_vm
8149a7f3aaSChristoph Müllnerth_dcache_cipa   0000001 01011 ..... 000 00000 0001011 @sfence_vm
8249a7f3aaSChristoph Müllnerth_dcache_ipa    0000001 01010 ..... 000 00000 0001011 @sfence_vm
8349a7f3aaSChristoph Müllnerth_dcache_cva    0000001 00101 ..... 000 00000 0001011 @sfence_vm
8449a7f3aaSChristoph Müllnerth_dcache_civa   0000001 00111 ..... 000 00000 0001011 @sfence_vm
8549a7f3aaSChristoph Müllnerth_dcache_iva    0000001 00110 ..... 000 00000 0001011 @sfence_vm
8649a7f3aaSChristoph Müllnerth_dcache_csw    0000001 00001 ..... 000 00000 0001011 @sfence_vm
8749a7f3aaSChristoph Müllnerth_dcache_cisw   0000001 00011 ..... 000 00000 0001011 @sfence_vm
8849a7f3aaSChristoph Müllnerth_dcache_isw    0000001 00010 ..... 000 00000 0001011 @sfence_vm
8949a7f3aaSChristoph Müllnerth_dcache_cpal1  0000001 01000 ..... 000 00000 0001011 @sfence_vm
9049a7f3aaSChristoph Müllnerth_dcache_cval1  0000001 00100 ..... 000 00000 0001011 @sfence_vm
9149a7f3aaSChristoph Müllnerth_icache_iall   0000000 10000 00000 000 00000 0001011
9249a7f3aaSChristoph Müllnerth_icache_ialls  0000000 10001 00000 000 00000 0001011
9349a7f3aaSChristoph Müllnerth_icache_ipa    0000001 11000 ..... 000 00000 0001011 @sfence_vm
9449a7f3aaSChristoph Müllnerth_icache_iva    0000001 10000 ..... 000 00000 0001011 @sfence_vm
9549a7f3aaSChristoph Müllnerth_l2cache_call  0000000 10101 00000 000 00000 0001011
9649a7f3aaSChristoph Müllnerth_l2cache_ciall 0000000 10111 00000 000 00000 0001011
9749a7f3aaSChristoph Müllnerth_l2cache_iall  0000000 10110 00000 000 00000 0001011
98134c3ffaSChristoph Müllner
9932909338SChristoph Müllner# XTheadCondMov
10032909338SChristoph Müllnerth_mveqz         0100000 ..... .....  001 ..... 0001011 @r
10132909338SChristoph Müllnerth_mvnez         0100001 ..... .....  001 ..... 0001011 @r
10232909338SChristoph Müllner
103d4d90115SChristoph Müllner# XTheadFMemIdx
104d4d90115SChristoph Müllnerth_flrd          01100 .. ..... ..... 110 ..... 0001011 @th_memidx
105d4d90115SChristoph Müllnerth_flrw          01000 .. ..... ..... 110 ..... 0001011 @th_memidx
106d4d90115SChristoph Müllnerth_flurd         01110 .. ..... ..... 110 ..... 0001011 @th_memidx
107d4d90115SChristoph Müllnerth_flurw         01010 .. ..... ..... 110 ..... 0001011 @th_memidx
108d4d90115SChristoph Müllnerth_fsrd          01100 .. ..... ..... 111 ..... 0001011 @th_memidx
109d4d90115SChristoph Müllnerth_fsrw          01000 .. ..... ..... 111 ..... 0001011 @th_memidx
110d4d90115SChristoph Müllnerth_fsurd         01110 .. ..... ..... 111 ..... 0001011 @th_memidx
111d4d90115SChristoph Müllnerth_fsurw         01010 .. ..... ..... 111 ..... 0001011 @th_memidx
112d4d90115SChristoph Müllner
113*578086baSChristoph Müllner# XTheadFmv
114*578086baSChristoph Müllnerth_fmv_hw_x      1010000  00000 ..... 001 ..... 0001011 @r2
115*578086baSChristoph Müllnerth_fmv_x_hw      1100000  00000 ..... 001 ..... 0001011 @r2
116*578086baSChristoph Müllner
117b8a5832bSChristoph Müllner# XTheadMac
118b8a5832bSChristoph Müllnerth_mula          00100 00 ..... ..... 001 ..... 0001011 @r
119b8a5832bSChristoph Müllnerth_mulah         00101 00 ..... ..... 001 ..... 0001011 @r
120b8a5832bSChristoph Müllnerth_mulaw         00100 10 ..... ..... 001 ..... 0001011 @r
121b8a5832bSChristoph Müllnerth_muls          00100 01 ..... ..... 001 ..... 0001011 @r
122b8a5832bSChristoph Müllnerth_mulsh         00101 01 ..... ..... 001 ..... 0001011 @r
123b8a5832bSChristoph Müllnerth_mulsw         00100 11 ..... ..... 001 ..... 0001011 @r
124b8a5832bSChristoph Müllner
12545f9df86SChristoph Müllner# XTheadMemIdx
12645f9df86SChristoph Müllnerth_ldia          01111 .. ..... ..... 100 ..... 0001011 @th_meminc
12745f9df86SChristoph Müllnerth_ldib          01101 .. ..... ..... 100 ..... 0001011 @th_meminc
12845f9df86SChristoph Müllnerth_lwia          01011 .. ..... ..... 100 ..... 0001011 @th_meminc
12945f9df86SChristoph Müllnerth_lwib          01001 .. ..... ..... 100 ..... 0001011 @th_meminc
13045f9df86SChristoph Müllnerth_lwuia         11011 .. ..... ..... 100 ..... 0001011 @th_meminc
13145f9df86SChristoph Müllnerth_lwuib         11001 .. ..... ..... 100 ..... 0001011 @th_meminc
13245f9df86SChristoph Müllnerth_lhia          00111 .. ..... ..... 100 ..... 0001011 @th_meminc
13345f9df86SChristoph Müllnerth_lhib          00101 .. ..... ..... 100 ..... 0001011 @th_meminc
13445f9df86SChristoph Müllnerth_lhuia         10111 .. ..... ..... 100 ..... 0001011 @th_meminc
13545f9df86SChristoph Müllnerth_lhuib         10101 .. ..... ..... 100 ..... 0001011 @th_meminc
13645f9df86SChristoph Müllnerth_lbia          00011 .. ..... ..... 100 ..... 0001011 @th_meminc
13745f9df86SChristoph Müllnerth_lbib          00001 .. ..... ..... 100 ..... 0001011 @th_meminc
13845f9df86SChristoph Müllnerth_lbuia         10011 .. ..... ..... 100 ..... 0001011 @th_meminc
13945f9df86SChristoph Müllnerth_lbuib         10001 .. ..... ..... 100 ..... 0001011 @th_meminc
14045f9df86SChristoph Müllnerth_sdia          01111 .. ..... ..... 101 ..... 0001011 @th_meminc
14145f9df86SChristoph Müllnerth_sdib          01101 .. ..... ..... 101 ..... 0001011 @th_meminc
14245f9df86SChristoph Müllnerth_swia          01011 .. ..... ..... 101 ..... 0001011 @th_meminc
14345f9df86SChristoph Müllnerth_swib          01001 .. ..... ..... 101 ..... 0001011 @th_meminc
14445f9df86SChristoph Müllnerth_shia          00111 .. ..... ..... 101 ..... 0001011 @th_meminc
14545f9df86SChristoph Müllnerth_shib          00101 .. ..... ..... 101 ..... 0001011 @th_meminc
14645f9df86SChristoph Müllnerth_sbia          00011 .. ..... ..... 101 ..... 0001011 @th_meminc
14745f9df86SChristoph Müllnerth_sbib          00001 .. ..... ..... 101 ..... 0001011 @th_meminc
14845f9df86SChristoph Müllner
14945f9df86SChristoph Müllnerth_lrd           01100 .. ..... ..... 100 ..... 0001011 @th_memidx
15045f9df86SChristoph Müllnerth_lrw           01000 .. ..... ..... 100 ..... 0001011 @th_memidx
15145f9df86SChristoph Müllnerth_lrwu          11000 .. ..... ..... 100 ..... 0001011 @th_memidx
15245f9df86SChristoph Müllnerth_lrh           00100 .. ..... ..... 100 ..... 0001011 @th_memidx
15345f9df86SChristoph Müllnerth_lrhu          10100 .. ..... ..... 100 ..... 0001011 @th_memidx
15445f9df86SChristoph Müllnerth_lrb           00000 .. ..... ..... 100 ..... 0001011 @th_memidx
15545f9df86SChristoph Müllnerth_lrbu          10000 .. ..... ..... 100 ..... 0001011 @th_memidx
15645f9df86SChristoph Müllnerth_srd           01100 .. ..... ..... 101 ..... 0001011 @th_memidx
15745f9df86SChristoph Müllnerth_srw           01000 .. ..... ..... 101 ..... 0001011 @th_memidx
15845f9df86SChristoph Müllnerth_srh           00100 .. ..... ..... 101 ..... 0001011 @th_memidx
15945f9df86SChristoph Müllnerth_srb           00000 .. ..... ..... 101 ..... 0001011 @th_memidx
16045f9df86SChristoph Müllner
16145f9df86SChristoph Müllnerth_lurd          01110 .. ..... ..... 100 ..... 0001011 @th_memidx
16245f9df86SChristoph Müllnerth_lurw          01010 .. ..... ..... 100 ..... 0001011 @th_memidx
16345f9df86SChristoph Müllnerth_lurwu         11010 .. ..... ..... 100 ..... 0001011 @th_memidx
16445f9df86SChristoph Müllnerth_lurh          00110 .. ..... ..... 100 ..... 0001011 @th_memidx
16545f9df86SChristoph Müllnerth_lurhu         10110 .. ..... ..... 100 ..... 0001011 @th_memidx
16645f9df86SChristoph Müllnerth_lurb          00010 .. ..... ..... 100 ..... 0001011 @th_memidx
16745f9df86SChristoph Müllnerth_lurbu         10010 .. ..... ..... 100 ..... 0001011 @th_memidx
16845f9df86SChristoph Müllnerth_surd          01110 .. ..... ..... 101 ..... 0001011 @th_memidx
16945f9df86SChristoph Müllnerth_surw          01010 .. ..... ..... 101 ..... 0001011 @th_memidx
17045f9df86SChristoph Müllnerth_surh          00110 .. ..... ..... 101 ..... 0001011 @th_memidx
17145f9df86SChristoph Müllnerth_surb          00010 .. ..... ..... 101 ..... 0001011 @th_memidx
17245f9df86SChristoph Müllner
173af99aa72SChristoph Müllner# XTheadMemPair
174af99aa72SChristoph Müllnerth_ldd           11111 .. ..... ..... 100 ..... 0001011 @th_pair
175af99aa72SChristoph Müllnerth_lwd           11100 .. ..... ..... 100 ..... 0001011 @th_pair
176af99aa72SChristoph Müllnerth_lwud          11110 .. ..... ..... 100 ..... 0001011 @th_pair
177af99aa72SChristoph Müllnerth_sdd           11111 .. ..... ..... 101 ..... 0001011 @th_pair
178af99aa72SChristoph Müllnerth_swd           11100 .. ..... ..... 101 ..... 0001011 @th_pair
179af99aa72SChristoph Müllner
180134c3ffaSChristoph Müllner# XTheadSync
181134c3ffaSChristoph Müllnerth_sfence_vmas   0000010 ..... ..... 000 00000 0001011 @rs2_s
182134c3ffaSChristoph Müllnerth_sync          0000000 11000 00000 000 00000 0001011
183134c3ffaSChristoph Müllnerth_sync_i        0000000 11010 00000 000 00000 0001011
184134c3ffaSChristoph Müllnerth_sync_is       0000000 11011 00000 000 00000 0001011
185134c3ffaSChristoph Müllnerth_sync_s        0000000 11001 00000 000 00000 0001011
186