From 8df0274582cedd9070bb92f6e7d9e225de005f1a Mon Sep 17 00:00:00 2001 From: liweiwei90 <34847211+liweiwei90@users.noreply.github.com> Date: Fri, 18 Nov 2022 07:33:13 +0800 Subject: Add support for Zc* extensions (#107) --- constants.py | 10 +++++++++- encoding.h | 7 +++++++ rv64_zcb | 1 + rv_zcb | 11 +++++++++++ rv_zcmp | 6 ++++++ rv_zcmt | 1 + 6 files changed, 35 insertions(+), 1 deletion(-) create mode 100644 rv64_zcb create mode 100644 rv_zcb create mode 100644 rv_zcmp create mode 100644 rv_zcmt diff --git a/constants.py b/constants.py index 5412751..372d2d3 100644 --- a/constants.py +++ b/constants.py @@ -2,7 +2,7 @@ import re isa_regex = \ -re.compile("^RV(32|64|128)[IE]+[ABCDEFGHJKLMNPQSTUVX]*(Zicsr|Zifencei|Zihintpause|Zam|Ztso|Zkne|Zknd|Zknh|Zkse|Zksh|Zkg|Zkb|Zkr|Zks|Zkn|Zba|Zbc|Zbb|Zbp|Zbr|Zbm|Zbs|Zbe|Zbf|Zbt|Zmmul|Zbpbo){,1}(_Zicsr){,1}(_Zifencei){,1}(_Zihintpause){,1}(_Zmmul){,1}(_Zam){,1}(_Zba){,1}(_Zbb){,1}(_Zbc){,1}(_Zbe){,1}(_Zbf){,1}(_Zbm){,1}(_Zbp){,1}(_Zbpbo){,1}(_Zbr){,1}(_Zbs){,1}(_Zbt){,1}(_Zkb){,1}(_Zkg){,1}(_Zkr){,1}(_Zks){,1}(_Zkn){,1}(_Zknd){,1}(_Zkne){,1}(_Zknh){,1}(_Zkse){,1}(_Zksh){,1}(_Ztso){,1}$") +re.compile("^RV(32|64|128)[IE]+[ABCDEFGHJKLMNPQSTUVX]*(Zicsr|Zifencei|Zihintpause|Zam|Ztso|Zkne|Zknd|Zknh|Zkse|Zksh|Zkg|Zkb|Zkr|Zks|Zkn|Zba|Zbc|Zbb|Zbp|Zbr|Zbm|Zbs|Zbe|Zbf|Zbt|Zmmul|Zbpbo|Zca|Zcf|Zcd|Zcb|Zcmp|Zcmt){,1}(_Zicsr){,1}(_Zifencei){,1}(_Zihintpause){,1}(_Zmmul){,1}(_Zam){,1}(_Zba){,1}(_Zbb){,1}(_Zbc){,1}(_Zbe){,1}(_Zbf){,1}(_Zbm){,1}(_Zbp){,1}(_Zbpbo){,1}(_Zbr){,1}(_Zbs){,1}(_Zbt){,1}(_Zkb){,1}(_Zkg){,1}(_Zkr){,1}(_Zks){,1}(_Zkn){,1}(_Zknd){,1}(_Zkne){,1}(_Zknh){,1}(_Zkse){,1}(_Zksh){,1}(_Ztso){,1}(_Zca){,1}(_Zcf){,1}(_Zcd){,1}(_Zcb){,1}(_Zcmp){,1}(_Zcmt){,1}$") # regex to find ..= patterns in instruction fixed_ranges = re.compile( @@ -57,6 +57,7 @@ csrs = [ (0x00A, 'vxrm'), (0x00F, 'vcsr'), (0x015, 'seed'), # Zkr + (0x017, 'jvt'), # Zcmt # Standard User RO (0xC00, 'cycle'), @@ -554,6 +555,11 @@ arg_lut['c_uimm9splo'] = (6,2) arg_lut['c_uimm9sphi'] = (12, 12) arg_lut['c_uimm10sp_s'] = (12,7) arg_lut['c_uimm9sp_s'] = (12,7) +arg_lut['c_uimm2'] = (6, 5) +arg_lut['c_uimm1'] = (5, 5) +arg_lut['c_rlist'] = (7, 4) +arg_lut['c_spimm'] = (3, 2) +arg_lut['c_index'] = (9, 2) arg_lut['rs1_p'] = (9,7) arg_lut['rs2_p'] = (4,2) @@ -567,6 +573,8 @@ arg_lut['rs1_n0'] = (11,7) arg_lut['c_rs2_n0'] = (6,2) arg_lut['c_rs1_n0'] = (11,7) arg_lut['c_rs2'] = (6,2) +arg_lut['c_sreg1'] = (9,7) +arg_lut['c_sreg2'] = (4,2) # dictionary containing the mapping of the argument to the what the fields in # the latex table should be diff --git a/encoding.h b/encoding.h index abb5ef8..b627a55 100644 --- a/encoding.h +++ b/encoding.h @@ -155,6 +155,7 @@ #define MSTATEEN0_CS 0x00000001 #define MSTATEEN0_FCSR 0x00000002 +#define MSTATEEN0_JVT 0x00000004 #define MSTATEEN0_HCONTEXT 0x0200000000000000 #define MSTATEEN0_HENVCFG 0x4000000000000000 #define MSTATEEN_HSTATEEN 0x8000000000000000 @@ -189,6 +190,7 @@ #define HSTATEEN0_CS 0x00000001 #define HSTATEEN0_FCSR 0x00000002 +#define HSTATEEN0_JVT 0x00000004 #define HSTATEEN0_SCONTEXT 0x0200000000000000 #define HSTATEEN0_SENVCFG 0x4000000000000000 #define HSTATEEN_SSTATEEN 0x8000000000000000 @@ -204,6 +206,7 @@ #define SSTATEEN0_CS 0x00000001 #define SSTATEEN0_FCSR 0x00000002 +#define SSTATEEN0_JVT 0x00000004 #define MSECCFG_MML 0x00000001 #define MSECCFG_MMWP 0x00000002 @@ -211,6 +214,10 @@ #define MSECCFG_USEED 0x00000100 #define MSECCFG_SSEED 0x00000200 +/* jvt fields */ +#define JVT_MODE 0x3F +#define JVT_BASE (~0x3F) + #define PRV_U 0 #define PRV_S 1 #define PRV_M 3 diff --git a/rv64_zcb b/rv64_zcb new file mode 100644 index 0000000..ed38047 --- /dev/null +++ b/rv64_zcb @@ -0,0 +1 @@ +c.zext.w rd_rs1_p 1..0=1 15..13=4 12..10=7 6..5=3 4..2=4 diff --git a/rv_zcb b/rv_zcb new file mode 100644 index 0000000..2e65437 --- /dev/null +++ b/rv_zcb @@ -0,0 +1,11 @@ +c.lbu rd_p rs1_p c_uimm2 1..0=0 15..13=4 12..10=0 +c.lhu rd_p rs1_p c_uimm1 1..0=0 15..13=4 12..10=1 6=0 +c.lh rd_p rs1_p c_uimm1 1..0=0 15..13=4 12..10=1 6=1 +c.sb rs2_p rs1_p c_uimm2 1..0=0 15..13=4 12..10=2 +c.sh rs2_p rs1_p c_uimm1 1..0=0 15..13=4 12..10=3 6=0 +c.zext.b rd_rs1_p 1..0=1 15..13=4 12..10=7 6..5=3 4..2=0 +c.sext.b rd_rs1_p 1..0=1 15..13=4 12..10=7 6..5=3 4..2=1 +c.zext.h rd_rs1_p 1..0=1 15..13=4 12..10=7 6..5=3 4..2=2 +c.sext.h rd_rs1_p 1..0=1 15..13=4 12..10=7 6..5=3 4..2=3 +c.not rd_rs1_p 1..0=1 15..13=4 12..10=7 6..5=3 4..2=5 +c.mul rd_rs1_p rs2_p 1..0=1 15..13=4 12..10=7 6..5=2 diff --git a/rv_zcmp b/rv_zcmp new file mode 100644 index 0000000..c72d1de --- /dev/null +++ b/rv_zcmp @@ -0,0 +1,6 @@ +cm.push c_rlist c_spimm 1..0=2 15..13=5 12..8=0x18 +cm.pop c_rlist c_spimm 1..0=2 15..13=5 12..8=0x1A +cm.popretz c_rlist c_spimm 1..0=2 15..13=5 12..8=0x1C +cm.popret c_rlist c_spimm 1..0=2 15..13=5 12..8=0x1E +cm.mvsa01 c_sreg1 c_sreg2 1..0=2 15..13=5 12..10=3 6..5=1 +cm.mva01s c_sreg1 c_sreg2 1..0=2 15..13=5 12..10=3 6..5=3 diff --git a/rv_zcmt b/rv_zcmt new file mode 100644 index 0000000..fab3dc9 --- /dev/null +++ b/rv_zcmt @@ -0,0 +1 @@ +cm.jalt c_index 1..0=2 15..13=5 12..10=0 -- cgit v1.1